澄清需要谷歌深刻梦想剧本的make_step功能

Ken*_*ama 16 python machine-learning neural-network

来自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)
Run Code Online (Sandbox Code Playgroud)

如果我理解正确的是什么,输入图像将net.blobs['data']被插入NN直到该层end.有一次,正向传递完成,直到end它计算出end来自"某物" 的斑点的"关闭".

问题

  • 这是什么"东西"?是dst.data吗?我通过一个调试器,发现dst.data在赋值后只是一个零矩阵,然后在向后传递后填充值.

  • 无论如何,假设它发现前向传递的结果是"关闭"的,为什么它会尝试向后传播?我认为深度梦想的重点不在于进一步训练模型,而是将输入图像"变形"为原始模型层所代表的任何内容.

  • 到底是src.data[:] += step_size/np.abs(g).mean() * g做什么的?似乎将上面所做的任何计算应用于原始图像.这条线实际上是"变形"图像吗?

我已经读过的链接

我会对所接受答案的作者的意思感兴趣

我们采用原始图层blob并在其中"增强"信号.这是什么意思,我不知道.也许他们只是将数值乘以系数,也许是别的东西.

在这篇博文中,作者旁边的评论是src.data[:] += step_size/np.abs(g).mean() * g:"更接近我们的目标数据." 我不太清楚"目标数据"在这里是什么意思.