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-й слой:

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