8

Я интересуюсь недавним сообщением Google от Google, в котором описывается использование nn, чтобы сделать искусство.Google Deep Dream art: как выбрать слой в нейронной сети и улучшить его

Я особенно заинтересован в одной методике:

«В этом случае мы просто кормить в сети произвольное изображение или фотографию, и пусть сеть анализировать картину. Затем мы выбираем слой и просим сеть улучшить все, что обнаружено. Каждый слой сети имеет дело с функциями на другом уровне абстракции, поэтому сложность создаваемых функций зависит от того, какой слой мы хотим улучшить. Например, нижние слои имеют тенденцию создавать штрихи или простые орнаментальные рисунки, потому что эти слои чувствительны к основным особенностям, таким как края и их ориентации ».

Должность http://googleresearch.blogspot.co.uk/2015/06/inceptionism-going-deeper-into-neural.html?m=1.

Мой вопрос: сообщение описывает это как «простой» случай - существует ли реализация nn с открытым исходным кодом, которая может быть использована для этой цели в процессе относительно plug-and-play? Как только описанная техника, нужно ли обучать сеть?

Без сомнения, для других технологий, упомянутых в документе, требуется сеть, уже обученная на большом количестве изображений, но для той, которую я описал, есть уже какой-то пакет визуализации сетевого уровня с открытым исходным кодом?

+0

Да, сеть должна быть обучена. [Caffe] (http://caffe.berkeleyvision.org/) - это то, что они и многие другие используют в качестве основы для начала работы (отличное ускорение gpu, для загрузки!): – Max

+0

Пожалуйста, не публикуйте стены текстов для вопросов хорошо :) Разделите их так, чтобы это не было устрашающим и читаемым. – gideon

ответ

8

UPD: Google опубликовал более подробные инструкции, как они реализовали его: https://github.com/google/deepdream/blob/master/dream.ipynb

Там также еще один проект: https://317070.github.io/Dream/

Если вы читаете 1, [2], [3], [4] с Вашей ссылки , вы увидите, что они использовали Caffe. Эта структура уже содержит обучаемые сети для игры. Вам не нужно ничего тренировать вручную, просто загрузите модели, используя сценарии .sh в папке models/.

Вы хотите «plug-and-play process», это не так просто, потому что помимо рамки нам нужен код скриптов, которые они использовали, и, возможно, патч Caffe. Я попытался сделать что-то, используя их описание. Caffe имеет интерфейс Python и Matlab, но в его внутренних функциях больше.

В тексте ниже описываются мои мысли о том, как это возможно реализовать. Я не уверен в своих словах, так что это больше похоже на приглашение исследовать меня, чем «процесс plug-and-play». Но, как никто еще не ответил, позвольте мне сказать это здесь. Может, кто-то меня исправит.

Так

Насколько я понимаю, они бегут оптимального качества

[sum((net.forwardTo(X, n) - enchanced_layer).^2) + lambda * R(X)] -> min

Т.е. найдите такой вход X, чтобы конкретный уровень сети выдавал «закодированные» данные вместо «исходных» данных.

Существует ограничение регуляризации R(X): X должно выглядеть как «естественное изображение» (без высокочастотного шума).

X - наш целевой образ.Исходным пунктом X0 является исходное изображение. forwardTo(X, n) - это то, что наша сеть производит в слое n, когда мы подаем входной сигнал с помощью X. Если вы говорите о Caffe, вы можете сделать полный перелёт (net.forward) и посмотреть интересующий вас блоб (net.blob_vec(n).get_data()).

enchanced_layer - мы берем исходный слой blob и сигналы «enchance». Что это значит, я не знаю. Возможно, они просто умножают значения на коэффициент, возможно, что-то еще.

Таким образом, sum((forwardTo(X, n) - enchanced_net).^2) станет нулевым, когда ваше входное изображение создаст именно то, что вы хотите в слое n.

lambda - параметр регуляризации, а R(X) - это как X выглядит естественным. Я не реализовал его, и мои результаты выглядели очень шумно. Что касается формулы, вы можете найти ее в [2].

Я использовал Matlab и fminlbfgs для оптимизации.

Ключевой частью было найти градиент формулы выше, потому что проблема имеет слишком много измерений для вычисления градиента численно.

Как я уже сказал, мне не удалось найти градиент R(X). Что касается основной части формулы, мне удалось найти это так:

  • Set дифф блоб в слое n к forwardTo(X, n) - enchanced_net. (см. документацию caffe для set_diff и set_data, set_data используется для пересылки и ждет данных, а set_diff используется для обратного распространения и ждет ошибок данных).
  • Выполнить частично backpropagation from layer n-1 на вход.
  • Входной бит blob будет содержать необходимый нам градиент.

Интерфейсы Python и Matlab НЕ содержат частичное обратное распространение, но внутренние элементы Caffe C++ содержат его. Я добавил патч ниже, чтобы сделать его доступным в Matlab.

Результат усиления 4-й слой:

Result of enhancing the 4th layer

Я не доволен результатами, но я думаю, что есть что-то общее с этой статьей.

  • Вот код, который создает изображение выше «как есть». Точка входа «run2.m», «fit2.m» содержит функцию приспособленности: https://github.com/galchinsky/caf
  • Вот кофейная патч интерфейс Matlab сделать частичное обратное распространение доступны: https://gist.github.com/anonymous/53d7cb44c072ae6320ff
3

В связи с IPython блокнот Дмитрий при условии, что он говорит, что он градиентподъём с максимальный L2 нормализация. Я считаю, что это означает, что Google означает улучшить функцию с алгоритмической точки зрения.

Если вы думаете об этом, это действительно так, минимизируя L2, это предотвратит чрезмерную установку, т. Е. Сделает кривую более гладкой. Если вы делаете обратное, вы делаете эту функцию более очевидной.

Вот отличная ссылка, чтобы понять gradient ascent, хотя в ней говорится о градиентном спуске в основном.

Не знаю много о деталях реализации в caffe, так как я использую theano в основном. Надеюсь, поможет!

Update

Так что я прочитал о подробных статьях [1], [2], [3], [4] сегодня и узнать, что [3] на самом деле говорит о алгоритма в деталях

Локально-оптимальный I можно найти методом обратного распространения . Процедура связана с процедурой обучения ConvNet, где обратное распространение используется для оптимизации весов слоев. Разница в том, что в нашем случае оптимизация выполняется по отношению к входному изображению, в то время как весы фиксируются по отношению к найденным на этапе обучения. Мы инициализировали оптимизацию с нулевым изображением (в нашем случае ConvNet обучался по данным с нулевым центром отсчета), а затем добавили среднее значение изображения тренировки к результату.

Таким образом, после обучения сети по классификации вы тренируете ее снова w.r.t на входное изображение, используя градиентное восхождение, чтобы получить более высокий балл для класса.

Смежные вопросы