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

В июле всех порадовала статья про 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 


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

Создайте папку /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. Тренировать сеть можно на случайных изображениях, идентичных или похожих.

© Habrahabr.ru