Python TensorFlow通道梯度未锁定
假设我在神经网络中使用了一些自定义操作Python TensorFlow通道梯度未锁定,python,numpy,tensorflow,Python,Numpy,Tensorflow,假设我在神经网络中使用了一些自定义操作二值化器。该操作采用一个张量,并构造一个新的张量。我想修改该操作,使其仅用于向前传球。在向后传递中,当计算渐变时,它应该只通过到达它的渐变 更具体地说,binarizer是: def binarizer(input): prob = tf.truediv(tf.add(1.0, input), 2.0) bernoulli = tf.contrib.distributions.Bernoulli(p=prob, dtype=tf.float3
二值化器。该操作采用一个张量
,并构造一个新的张量
。我想修改该操作,使其仅用于向前传球。在向后传递中,当计算渐变时,它应该只通过到达它的渐变
更具体地说,binarizer
是:
def binarizer(input):
prob = tf.truediv(tf.add(1.0, input), 2.0)
bernoulli = tf.contrib.distributions.Bernoulli(p=prob, dtype=tf.float32)
return 2 * bernoulli.sample() - 1
我设置了我的网络:
# ...
h1_before_my_op = tf.nn.tanh(tf.matmul(x, W) + bias_h1)
h1 = binarizer(h1_before_b)
# ...
loss = tf.reduce_mean(tf.square(y - y_true))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(loss)
如何让TensorFlow在向后传球时跳过梯度计算
我尝试定义中所述的自定义操作,但是:py_func
无法返回Tensor
s,这不是它的用途–我得到:
UnimplementedError(回溯见上文):不支持的对象类型张量
您正在寻找:
停止梯度计算
在图形中执行时,此op按原样输出其输入张量
谢谢但这似乎阻止了梯度,而不是传递它们?也就是说,h1
左侧的所有内容在我的测试中都不接受梯度:与h1
左侧阶段相关的所有权重不会通过训练步骤更新,右侧的权重会更新……您希望您的子图在向后传球时表现得像tf.identity
,所以你可以在这里使用技巧--@YaroslavBulatov Nice!今天我终于有时间实现了,它似乎起了作用!
h1 = binarizer(h1_before_b)
h1 = tf.stop_gradient(h1)