2017-04-02 125 views
0

我有一個非常簡單的實現通過kadenze例如https://github.com/pkmital/CADL/blob/master/session-4/lecture-4.ipynb啓發深夢想算法:如何梯度計算DeepDream

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。我明白我錯過了什麼,但究竟是什麼?

回答

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我們可以建議來支持其「神經元」,我們期望得到最大的一次傳播算法 - 因此它會計算梯度wrt不是實際的(y[0]),而是自定義的(y[1])。

,如果我們知道什麼特定的神經元,我們感興趣的是我們可以做的更簡單:

session.run(
    tf.gradients(y[1], x)[0], 
)