因此,我的网络输出是一个可用性列表,然后我使用tf.round()将其舍入为0或1,这对于此项目至关重要。 然后我发现tf.round是不可分的,所以我有点迷失了......:/
答案 0 :(得分:5)
你可以使用tf.maximum()和tf.minimum()是可微分的这一事实,输入的概率从0到1
# round numbers less than 0.5 to zero;
# by making them negative and taking the maximum with 0
differentiable_round = tf.maximum(x-0.499,0)
# scale the remaining numbers (0 to 0.5) to greater than 1
# the other half (zeros) is not affected by multiplication
differentiable_round = differentiable_round * 10000
# take the minimum with 1
differentiable_round = tf.minimum(differentiable_round, 1)
示例:
[0.1, 0.5, 0.7]
[-0.0989, 0.001, 0.20099] # x - 0.499
[0, 0.001, 0.20099] # max(x-0.499, 0)
[0, 10, 2009.9] # max(x-0.499, 0) * 10000
[0, 1.0, 1.0] # min(max(x-0.499, 0) * 10000, 1)
答案 1 :(得分:3)
答案 2 :(得分:1)
这对我有用:
x_rounded_NOT_differentiable = tf.round(x)
x_rounded_differentiable = (x - (tf.stop_gradient(x) - x_rounded_NOT_differentiable))
答案 3 :(得分:0)
答案 4 :(得分:0)
在范围0 1中,转换和缩放S形可能是一种解决方案:
slope = 1000
center = 0.5
e = tf.exp(slope*(x-center))
round_diff = e/(e+1)
答案 5 :(得分:0)
基于先前的答案,一种获得任意良好近似值的方法是使用有限傅立叶近似值来近似round()
并根据需要使用任意多个项。从根本上讲,您可以将round(x)
视为向x
添加反向(即下降)锯齿波。因此,使用锯齿波的傅立叶展开,我们得到
答案 6 :(得分:0)
一个老问题,但我刚刚为 TensorFlow 2.0 解决了这个问题。我在我的音频自动编码器项目中使用以下轮函数。我基本上想创建一个在时间上被压缩的声音的离散表示。我使用 round 函数将编码器的输出限制为整数值。到目前为止,它对我来说效果很好。
@tf.custom_gradient
def round_with_gradients(x):
def grad(dy):
return dy
return tf.round(x), grad