我无法规范张量流中的数据,导致np.nan
和np.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)
,但同样错误。
答案 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)