2017-10-06 26 views
0

因此,我的网络输出是一个合法性列表,然后我使用tf.round()将其舍入为0或1,这对于此项目至关重要。 然后我发现tf.round是不可区分的,所以我有点不知所以了..:/Tensorflow中的可微调圆函数?

回答

1

舍入是一个根本无法区分的函数,所以你在那里运气不好。这种情况的正常程序是找到一种方法来使用概率,比方说使用它们来计算预期值,或者通过获取输出的最大概率,并选择那个概率作为网络的预测。如果你没有使用输出来计算你的损失函数,你可以继续,并将其应用于结果,并且它是否可以区分并不重要。现在,如果你想要一个信息丢失函数来训练网络,也许你应该考虑是否保持输出的概率格式可能实际上对你有利(它可能会使你的训练过程更平滑) - 那样你只需将训练后的概率转换为网络外部的实际估计值即可。

+0

我的输出必须是1或者0的值。但是因为训练数据中的大部分输出都是0,网络只能学习输出从0到0.0001的非常低的值,而且我真的有点迷失在这里。所以我认为迫使它输出一个1或0会帮助..我想只是把一个1而不是圆的函数的派生应该是,但是我再次使用Tensorflow我不能决定衍生物 – ronsap123

0

可以使用以下事实: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)