我有一个非常简单的Deep Dream算法实现,受到kadenze示例https://github.com/pkmital/CADL/blob/master/session-4/lecture-4.ipynb的启发:
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
)替换实际的图层激活并获得正确的渐变?
我做了一个简单的实验:
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
- 我总是在点x
3.0
6.0
得到正确的渐变。 <item name="android:windowTranslucentStatus">true</item>
。我明白我错过了什么,但到底是什么?
答案 0 :(得分:0)
我想我现在可以回答我的问题了 - 事实证明我有一个糟糕的例子。
这个答案更能说明这是如何运作的:
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]
)。
如果我们知道我们感兴趣的特定神经元,我们可以做得更简单:
session.run(
tf.gradients(y[1], x)[0],
)