Deep Dream: как обучить нейронную сеть мечтать не только о собаках

Автор оригинала: tsulej
  • Перевод
  • Tutorial
В июле всех порадовала статья про deep dream или инцепционизм от Google. В статье подробно рассказывалось и показывалось как нейронные сети рисуют картины и зачем их заставили это делать. Вот эта статья на хабре.

Теперь все, у кого настроена среда caffe, кому скучно и у кого есть свободное время могут сделать собственные фотки в стиле инцепционизм. Одна проблема — почти на всех фотках получаются собаки. Как же избавится от элементов с псами в изображениях deep dream и обучить свою нейронную сеть пользоваться другими картинками?

image


Пошаговая инструкция


Для этой задачи не надо обучать сеть с нуля — занимайтесь лишь настройкой параметров в Googlenet. Построение сети с нуля требует массу времени, сотни часов. Прежде чем начать, прочтите это.

Самая сложная часть — скачать 200-1000 изображений, которые хотите использовать для обучения. Автор пришел к выводу, что хорошо работают однотипные изображения. Можно использовать лица, картинки порнографического характера, письма, животных, огнестрельное оружие и так далее.

Измените размер всех картинок на 256х256. Сохраните их как Truecolor JPG (но не в Grayscale, даже если изображение черно-белое).

Вычислите среднецветовые показатели всех ваших изображений (это по желанию). Нужно знать о средних показателях красного, зелёного и синего в наборе картинок. Для этого автор использует инструменты convert и identify в ImageMagick

convert *.jpg -average res.png 
identify -verbose res.png 

Так можно увидеть усреднённый показатель по каждому цветовому каналу.

Создайте папку <caffe_path>/models/MYNET.
Это рабочая папка. Все созданные папки и файлы будут помещены в MYNET.

Создайте папку с названием ‘images’
(в рабочей папке в MYNET).

Для каждого из изображений нужно создать отдельную папку внутри папки ‘images’. Автор использует числа, начиная с 0. Например, ‘images/0/firstimage.jpg’,
‘images/1/secondimage.jpg’,
и так далее. Каждая папка – это категория, так что в итоге у вас получится много папок, каждая из которых содержит по одному изображению.

Создайте текстовый файл с названием train.txt
 (и разместите его в рабочей папке). Каждая строка в этом файле должна содержать путь к изображению с номером категории изображения. Выглядит это так:

images/0/firstimage.jpg 0

images/1/secondimage.jpg 1

…

Скопируйте содержимое файла train.txt
в файлval.txt.
Скопируйте файлы deploy.prototxt,
train_val.prototxt
и solver.prototxt
в рабочую папку вот отсюда.

Как редактировать файлы


1. train_val.prototxt

Строки 13-15 (и 34-36) определяют средние значения для вашего набора картинок для синего, зелёного и красного каналов (именно в этой последовательности). Если вы не знаете значений, просто выставьте везде «129»

В строке 19 укажите число одновременно обрабатываемых изображений. 4-гигабайтный графический процессор может справиться с 40 изображениями, ну, а если процессор 2 Гб, количество нужно будет сократить до 20. Если введенное вами число слишком высоко, программа выдаст ошибку «недостаточно памяти» и нужно будет ввести меньшее значение. Подойдёт любое количество картинок, даже 1.

Строки 917, 1680 и 2393. num_output
должен соответствовать количеству ваших категорий, т.е. количеству папок в каталоге с изображениями.

2. deploy.prototxt

Строка 2141, num_output
должен быть таким же, как и в предыдущем файле.

3. solver.prototxt

Очень важно изменить следующие значения:

  • display: 20 – печатать статистику после кадых 20 итераций
  • base_lr: 0.0005 – скорость обучения (learning rate), её можно менять. base_lr можно адаптировать исходя из результатов (см. стратегию ниже)
  • max_iter: 200000 – максимальное количество итераций для обучения. Здесь можно указывать хоть 1000000.
  • snapshot: 5000 – как часто будет сохраняться прогресс. (в данном случае каждые 5000 итераций). Это значение обязательно нужно если понадобится остановить обучение в какой-либо точке.

Почти всё готово


Ещё нужен googlenet. Открываем caffe/models/bvlc_googlenet
и сохраняем этот файл сюда.

Переходим в рабочую папку и выполняем эту команду:

../../build/tools/caffe train -solver ./solver.prototxt -weights ../bvlc_googlenet/bvlc_googlenet.caffemodel

Каждые 5000 итераций будет сохраняться прогресс. Когда он сохранится, можно прервать обучение и запустить Deep Dream в сети. Первые результаты должны будут видны в слое inception_5b/output
.
Чтобы возобновить обучение, используйте последнее сохранение прогресса со следующей командой:

../../build/tools/caffe train -solver ./solver.prototxt -snapshot ./MYNET_iter_5000.solverstate

Стратегии для base_lr


Есть несколько стратегий для base_lr
во время первых 1000 итераций. Наблюдайте за процентом потерь. Во время обучения значение должно постепенно снижаться вплоть до 0.0, однако:

  • Если вы видите, что процент потерь всё выше и выше, прервите обучение и установите значение base_lr
    в пять раз ниже текущего.
  • Если процент потерь «застрял» на одном уровне и снижается очень медленно, прервите обучение и установите значение base_lr
    в 5 раз выше предыдущего значения.
  • Ели не сработала ни одна из вышеперечисленных стратегий, то, вероятно, есть проблема и обучение провалено. Смените набор изображений и попробуйте ещё раз.

Немного инсайтов


Графический процессор автора — NVIDIA GTX960 с 4 Гб RAM. Caffe скомпилирован с библиотекой CuDNN. Каждые 5000 итераций занимали около часа. При использовании CPU вычисления были медленнее в 40 раз.

Автор советует прекращать обучение после 40 тысяч итераций, но однажды сделал 90 тысяч. У пользователя с ником DeepDickDream ушло 750 тысяч итераций на то, чтобы сложить из членов портрет Халка Хогана.

У вас мало шансов сделать набор изображений заметными, если вы делаете менее 100 000 итераций, но есть хороший шанс увидеть что-то новое… и без собак.

В одной категории может находиться больше изображений чем в других. Например, можно использовать 20 категорий с двумя сотнями картинок в них. Тренировать сеть можно на случайных изображениях, идентичных или похожих – в общем, всё, что угодно. У автора не получилось выделить правило, обеспечивающее лучший результат. Возможно всё зависит от контента.

Примеры


Сеть, обученная с помощью изображений из Британской библиотеки. 11 категорий. 100 тысяч изображений (у каждого изображения было по 10 вариантов). Слои inception 3, 4 и 5 были очищены. Результат получился после 25 тысяч итераций. Лица из портретного альбома чётко видны. Вот изображение со слоя 5b/output
.

image

Подраздел Британской библиотеки, содержащий исключительно письма. 750 категорий, по одному изображению в каждой. 40 тысяч итераций. Вычищен только слой classification. Интересно почему четко видны бабочки? Слой 5b.

image

Та же картинка, но с песочными часами. Слой 5a.

image

А вот набор порнографического характера. 94 категории, 100 изображений в каждой. 90 тысяч итераций. Слой 5b.

image

Изображение, аналогичное предыдущему, но с измененным набором картинок (использованы эффекты поворота изображений, отражения, нормализации, размытия и прочее). 40 тысяч итераций. Слой 5b.

image

4 категории искаженных изображений, по 1000 каждое, 65 тысяч итераций. Слой Pool5.

image

Изображение, подобное предыдущему. 80 тысяч итераций. С пустыми 3,4 и 5 слоями. Слой 5b.

image

Конспект


  1. Для этой задачи не надо обучать сеть с нуля — занимайтесь лишь настройкой параметров в Googlenet.
  2. Самая сложная часть — скачать 200-1000 изображений, которые хотите использовать для обучения.
  3. Хорошо работают однотипные изображения.
  4. Размер всех картинок нужно изменить на 256х256.
  5. Тренировать сеть можно на случайных изображениях, идентичных или похожих.
  • +21
  • 28,9k
  • 5
.io
0,00
Компания
Поделиться публикацией

Похожие публикации

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 5

    0
    Сегодня день deep dream прям какой-то. Приятно.
      +7
      Почему нейронная сеть натаскана на собак, а не на котиков? Это какой-то котофобный заговор?
      0
      А на чем все это написано? На питоне?
        0
        на компьютере

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое