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)