文章目录
1.过程
1.1 输入准备和输出
输入:训练好的神经网络模型,例如Inception-V3模型;
一张需要加工的图片,记做original_image,如下图所示;
输出:经过DeepDream加工之后的图片,如下图所示,记做image。image初始值设置为original_image。
1.2 选定输入的模型的某个(些)层,构造目标函数L
目标函数L是对选定的所有的层的输出(官方文档说‘activation’说的稍微有点不明白,其实就是每层的输出),每层求均值,对这些均值再求和。
1.3 计算目标函数L关于图片每个像素的梯度grad(L,image)
计算得到的梯度的维度和图片的维度是相同的。
1.4 根据梯度更新image
image=image+grad(L,image)*learning_rate,普通的SGD是‘减’梯度,这里是‘加’;所以可以理解这里的方向是增加目标函数L。
1.5 重复1.3~1.4直到达到给定的步数
例如100步
2. 原理理解
可以看到上述过程主要步骤是:计算目标函数L对于输入图片的梯度,然后用这个梯度来更新image,更新的方向是使目标函数L增大。
我理解的DeepDream就是根据某个(些)层的输出对于输入(输入的图片)的敏感度(导数的含义)来更新原图片,就是原图片加上模型中提取的某些特征,造成很多奇怪同时看上去有些规律的图片,就像做梦一样(人做梦也是奇怪又有些规律)。