来自https://github.com/google/deepdream/blob/master/dream.ipynb
def objective_L2(dst): # Our training objective. Google has since release a way to load
dst.diff[:] = dst.data # arbitrary objectives from other images. We'll go into this later.
def make_step(net, step_size=1.5, end='inception_4c/output',
jitter=32, clip=True, objective=objective_L2):
'''Basic gradient ascent step.'''
src = net.blobs['data'] # input image is stored in Net's 'data' blob
dst = net.blobs[end]
ox, oy = np.random.randint(-jitter, jitter+1, 2)
src.data[0] = np.roll(np.roll(src.data[0], ox, -1), oy, -2) # apply jitter shift
net.forward(end=end)
objective(dst) # specify the optimization objective
net.backward(start=end)
g = src.diff[0]
# apply normalized ascent step to the input image
src.data[:] += step_size/np.abs(g).mean() * g
src.data[0] = np.roll(np.roll(src.data[0], -ox, -1), -oy, -2) # unshift image
if clip:
bias = net.transformer.mean['data']
src.data[:] = np.clip(src.data, -bias, 255-bias)
如果我正确理解发生了什么,输入图像 innet.blobs['data']
将插入到 NN 中,直到 layer end
。一次,前向传递完成,直到end
,它会计算 处的 blobend
与“某物”的“关闭”程度。
问题
这是什么“东西”?是
dst.data
吗?我逐步调试了一个调试器,发现它dst.data
在赋值之后只是一个零矩阵,然后在反向传递之后填充了值。无论如何,假设它发现前向传播的结果有多“偏离”,为什么它会尝试进行反向传播?我认为深度梦想的重点不是进一步训练模型,而是将输入图像“变形”为原始模型层所代表的任何内容。
具体是
src.data[:] += step_size/np.abs(g).mean() * g
做什么的?似乎将上面所做的任何计算应用于原始图像。这条线实际上是“变形”图像吗?
我已经阅读过的链接
我会对接受答案的作者的意思感兴趣
我们在其中获取原始层 blob 和“增强”信号。什么意思,我不知道。也许他们只是将值乘以系数,也许是别的。
在这篇博文中,作者在旁边评论src.data[:] += step_size/np.abs(g).mean() * g
:“更接近我们的目标数据。” 我不太清楚这里的“目标数据”是什么意思。
请注意,正如我在评论中建议的那样,我从https://stackoverflow.com/q/40690099/2750819交叉发布此内容。