张量流中的数据归一化

时间:2017-06-27 12:04:45

标签: python tensorflow

我无法规范张量流中的数据,导致np.nannp.inf的损失导致训练中断。

我的图片位于[-1, +1]范围内。我想计算二元交叉熵损失

_bce = -1 * tf.reduce_sum(tf.mul(img1_n, img2_n)) + tf.mul((1 - img1_n),tf.log(1 - img2_n)), 0)

bce_loss = tf.reduce_mean(_bce)

在计算损失之前,我将图像标准化为:

img1_n = (img1 + 1)/2 - 1e-8 #to prevent NaN and inf
img2_n = np.flip(img1_n)

这样tf.log()(0,1)获取的值不包含在内。 我这样抓错了:

if np.isnan(bce_loss) or np.isinf(bce_loss):
    foo = (img1 + 1)/2 - 1e-8                          
    goo = (img1 + 1)/2 
    hoo = ((1 - 2 * 1e-8) * g + 1 - 2 * 1e-8)/2 # scaled to get [0 + 1e-8, 1 - 1e-8] ~= (0, 1)                           
    print np.min(img1), np.max(img1) #img1 ~ [-1, 1]        # -0.998874 1.0
    print np.min(img1_n), np.max(img1_n) #img1_n ~ (0, 1)   # 0.000563224 1.0 
    print np.min(foo), np.max(foo)                          # 0.000563234 1.0
    print np.min(goo) - 1e-8, np.max(goo) - 1e-8            # 0.000563224090805 0.99999999
    print np.min(hoo), np.max(hoo)                          # 0.000563234 1.0

np.inf错误发生,因为np.log(1 - x)操作。1e-4为什么这些值不会被缩放?我无法减去1e-8的值。人们怎么做标准化?

如果我将epsilon用作1e-8而不是1e-8,则缩放有效。考虑到numpy浮点数是64位,为什么不计算1e-8?我尝试将0.00000001替换为foo() console.log(undefined == 2),但同样错误。

1 个答案:

答案 0 :(得分:2)

TensorFlow的默认浮点精度为float32,其分辨率为1e-6。您可以像这样检查numpy中的类型的分辨率:

In [5]: np.finfo(np.float32)
Out[5]: finfo(resolution=1e-06, min=-3.4028235e+38, max=3.4028235e+38, dtype=float32)