[Перевод] Deep Dream: как обучить нейронную сеть мечтать не только о собаках
В июле всех порадовала статья про deep dream или инцепционизм от Google. В статье подробно рассказывалось и показывалось как нейронные сети рисуют картины, зачем их заставили это делать. Вот эта статья на хабре.
Теперь все, у кого настроена среда caffe, кому скучно и у кого есть свободное время могут сделать собственные фотки в стиле инцепционизм. Одна проблема — почти на всех фотках получаются собаки. Как же избавится от элементов с псами в изображениях deep dream и обучить свою нейронную сеть пользоваться другими картинками?
Пошаговая инструкция
Для этой задачи не надо обучать сеть с нуля — занимайтесь лишь настройкой параметров в Googlenet. Построение сети с нуля требует массу времени, сотни часов. Прежде чем начать, прочтите это.
Самая сложная часть — скачать 200–1000 изображений, которые хотите использовать для обучения. Автор пришел к выводу, что хорошо работают однотипные изображения. Можно использовать лица, картинки порнографического характера, письма, животных, огнестрельное оружие и так далее.
Измените размер всех картинок на 256×256. Сохраните их как Truecolor JPG (но не в Grayscale, даже если изображение черно-белое).
Вычислите среднецветовые показатели всех ваших изображений (это по желанию). Нужно знать о средних показателях красного, зелёного и синего в наборе картинок. Для этого автор использует инструменты convert и identify в ImageMagick:
convert *.jpg -average res.png
identify -verbose res.png
Так можно увидеть усреднённый показатель по каждому цветовому каналу.
Создайте папку
Это рабочая папка. Все созданные папки и файлы будут помещены в 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
.
Подраздел Британской библиотеки, содержащий исключительно письма. 750 категорий, по одному изображению в каждой. 40 тысяч итераций. Вычищен только слой classification. Интересно почему четко видны бабочки? Слой 5b.
Та же картинка, но с песочными часами. Слой 5a.
А вот набор порнографического характера. 94 категории, 100 изображений в каждой. 90 тысяч итераций. Слой 5b.
Изображение, аналогичное предыдущему, но с измененным набором картинок (использованы эффекты поворота изображений, отражения, нормализации, размытия и прочее). 40 тысяч итераций. Слой 5b.
4 категории искаженных изображений, по 1000 каждое, 65 тысяч итераций. Слой Pool5.
Изображение, подобное предыдущему. 80 тысяч итераций. С пустыми 3,4 и 5 слоями. Слой 5b.
Конспект
- Для этой задачи не надо обучать сеть с нуля — занимайтесь лишь настройкой параметров в Googlenet.
- Самая сложная часть — скачать 200–1000 изображений, которые хотите использовать для обучения.
- Хорошо работают однотипные изображения.
- Размер всех картинок нужно изменить на 256×256.
- Тренировать сеть можно на случайных изображениях, идентичных или похожих.