我有一个 tensorflow 表达式,我想根据我是计算前向还是后向(梯度)传递来使用不同的表达式。具体来说,我想忽略在反向传递期间添加到网络中的一些随机性(噪声)的影响。
这是一个简化的例子
import numpy as np
import tensorflow as tf
x = tf.placeholder(tf.float32)
y = x**2
u = tf.random_uniform(tf.shape(x), minval=0.9, maxval=1.1)
yu = y * u
z = tf.sqrt(yu)
g = tf.gradients(z, x)[0]
with tf.Session() as sess:
yv, yuv, zv, gv = sess.run([y,yu,z,g], {x: [-2, -1, 1]})
print(yv)
print(yuv)
print(zv)
print(gv)
输出类似的东西
[4. 1. 1.]
[4.1626534 0.9370764 1.0806011]
[2.0402582 0.96802706 1.0395197 ]
[-1.0201291 -0.96802706 1.0395197 ]
这里的最后一个值是关于 的导z
数x
。我希望它们不包括乘性噪声项u
,即它们应该始终[-1, -1, 1]
适用于 的这些输入值x
。
有没有办法只使用 Python 来做这样的事情?我知道我可以在 C 中创建一个自定义运算符并为它定义一个自定义渐变,但如果可能的话,我想避免这种情况。
另外,我希望将其用作 Keras 层的一部分,因此基于 Keras 的解决方案将是一种替代方案(即,如果可以为通过 Keras 层的向前和向后传递定义不同的表达式)。这确实意味着仅仅定义第二个表达式z2 = tf.sqrt(y)
并调用gradients
它对我来说不是一个解决方案,因为我不知道如何将它放在 Keras 中(因为在 Keras 中,它将是一个很长的计算的一部分图形)。