首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为DeepDream计算渐变

如何为DeepDream计算渐变
EN

Stack Overflow用户
提问于 2017-04-03 00:48:28
回答 1查看 116关注 0票数 0

我有一个非常简单的实现深度梦想算法的灵感来自卡登泽示例https://github.com/pkmital/CADL/blob/master/session-4/lecture-4.ipynb

代码语言:javascript
复制
layer = graph.get_tensor_by_name('inception/output2:0')
layer_size = layer.eval({x: img_4d}).shape

neuron_i = 110

layer_activation = np.zeros(layer_size)
layer_activation[..., neuron_i] = 1

grad = tf.gradients(layer[..., neuron_i], x)[0]

img_noise_4d = img_noise.copy()[np.newaxis]
img_noise_4d /=  255.0

grad_step = 4.0
n_steps = 100
for step in range(n_steps):
    print(step, end=', ')
    res = grad.eval({layer: layer_activation, x: img_noise_4d})
    res /= (np.max(np.abs(res)) + 1e-8)
    img_noise_4d += res * grad_step

plt.imshow(normalize(img_noise_4d[0]))

我不能理解的是它是如何工作的--我的意思是,我们如何用我们生成的(layer_activation)层激活来替换实际的层激活,并获得正确的梯度?

我做了一个简单的实验:

代码语言:javascript
复制
x = tf.Variable(3.0)
y = x**2

session = tf.InteractiveSession()
session.run(tf.global_variables_initializer())

session.run(tf.gradients(y, x)[0], {y: 100})

无论我将y替换为什么,我总是在点3.0中得到正确的梯度,即6.0。我知道我漏掉了一些东西,但到底是什么?

EN

回答 1

Stack Overflow用户

发布于 2017-04-03 06:08:35

我想我现在可以回答我的问题了--事实证明我有一个不好的例子。

这个答案更好地说明了它是如何工作的:

代码语言:javascript
复制
x = tf.Variable(3.0)
w = tf.Variable([6.0, 2.0])
y = x * w

session = tf.InteractiveSession()
session.run(tf.global_variables_initializer())

session.run(
    tf.gradients(tf.reduce_max(y), x)[0], 
    {y: [3, 9],
})

因此,基本上通过将自定义y传递给session.run,我们可以建议反向传播算法,我们希望哪个“神经元”是最大的一个-因此它将计算梯度w.r.t。不是实际的(y[0]),而是自定义的(y[1])。

如果我们知道我们感兴趣的特定神经元,我们可以做得更简单:

代码语言:javascript
复制
session.run(
    tf.gradients(y[1], x)[0], 
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43170888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档