为什么Tensorflow重塑tf.reshape()会破坏渐变的流动?

Sri*_*ana 6 python tensorflow

我正在创建一个tf.Variable(),然后使用该变量创建一个简单的函数,然后我使用tf.reshape()展平原始变量,然后我在函数和展平变量之间使用tf.gradients().为什么返回[无].

var = tf.Variable(np.ones((5,5)), dtype = tf.float32)
f = tf.reduce_sum(tf.reduce_sum(tf.square(var)))
var_f = tf.reshape(var, [-1])
print tf.gradients(f,var_f)
Run Code Online (Sandbox Code Playgroud)

执行上面的代码块返回[None].这是一个错误吗?请帮忙!

vij*_*y m 6

f您正在找到关于 的导数var_f,但f不是 的函数,var_f而是var。这就是为什么你得到[无]。现在,如果您将代码更改为:

 var = tf.Variable(np.ones((5,5)), dtype = tf.float32)
 var_f = tf.reshape(var, [-1])
 f = tf.reduce_sum(tf.reduce_sum(tf.square(var_f)))
 grad = tf.gradients(f,var_f)
 print(grad)
Run Code Online (Sandbox Code Playgroud)

你的梯度将被定义:

tf.张量 'gradients_28/Square_32_grad/mul_1:0' shape=(25,) dtype=float32>

以下代码的图表可视化如下:

 var = tf.Variable(np.ones((5,5)), dtype = tf.float32, name='var')
 f = tf.reduce_sum(tf.reduce_sum(tf.square(var)), name='f')
 var_f = tf.reshape(var, [-1], name='var_f')
 grad_1 = tf.gradients(f,var_f, name='grad_1')
 grad_2 = tf.gradients(f,var, name='grad_2')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

的导数grad_1未定义,而 forgrad_2的导数已定义。显示了两个梯度的反向传播图(梯度图)。