我为自己写了一个客户损失,但是经过几步之后,损失变成了nan,我的代码是
def my_loss(label_batch, logits_batch, alpha=1.3, beta=0.5):
softmax_logits_batch = tf.nn.softmax(logits_batch, axis=-1)
indices_not_0 = tf.where(tf.not_equal(label_batch, 0)) # not-zero indices
indices_0 = tf.where(tf.equal(label_batch, 0)) # zero indices
predict_not_0 = tf.gather_nd(softmax_logits_batch, indices_not_0)
predict_0 = tf.gather_nd(softmax_logits_batch, indices_0)
avg_p_not_0 = tf.reduce_mean(predict_not_0, axis=0)
avg_p_0 = tf.reduce_mean(predict_0, axis=0)
euclidean_distance = tf.sqrt(tf.reduce_sum(tf.square(avg_p_0 - avg_p_not_0)))
max_value = tf.maximum(alpha - euclidean_distance, 0)
return max_value
2类
.
标签批次的形状为
,其中的所有值都是0或1。logits_批处理的形状是
(?,高,宽,2)
logits_batch的值是
FCN的登录(不带Softmax)
全部的
logits值(
预测?0
或
预测
)其标签值分别为0或1
指数0
索引\u不\u 0
.
(?,2)
分别计算predict_not_0和predict_0的平均值(表示类别0和类别1的欧几里德空间的中心点坐标)。它们的形状应该是
(2,)
计算两个中心点坐标之间的欧几里德距离,它应该大于一定的
阿尔法
值(例如alpha=1.3)
Epoch[0],step[1],train batch loss = 2.87282,train acc = 0.486435.
Epoch[0],step[2],train batch loss = 2.87282,train acc = 0.485756.
Epoch[0],step[3],train batch loss = 2.87281,train acc = 0.485614.
Epoch[0],step[4],train batch loss = 2.87282,train acc = 0.485649.
Epoch[0],step[5],train batch loss = 2.87282,train acc = 0.485185.
Epoch[0],step[6],train batch loss = 2.87279,train acc = 0.485292.
Epoch[0],step[7],train batch loss = 2.87281,train acc = 0.485222.
Epoch[0],step[8],train batch loss = 2.87282,train acc = 0.484989.
Epoch[0],step[9],train batch loss = 2.87282,train acc = 0.48406.
Epoch[0],step[10],train batch loss = 2.8728,train acc = 0.483306.
Epoch[0],step[11],train batch loss = 2.87281,train acc = 0.483426.
Epoch[0],step[12],train batch loss = 2.8728,train acc = 0.482954.
Epoch[0],step[13],train batch loss = 2.87281,train acc = 0.482535.
Epoch[0],step[14],train batch loss = 2.87281,train acc = 0.482225.
Epoch[0],step[15],train batch loss = 2.87279,train acc = 0.482005.
Epoch[0],step[16],train batch loss = 2.87281,train acc = 0.48182.
Epoch[0],step[17],train batch loss = 2.87282,train acc = 0.48169.
Epoch[0],step[18],train batch loss = 2.8728,train acc = 0.481279.
Epoch[0],step[19],train batch loss = 2.87281,train acc = 0.480878.
Epoch[0],step[20],train batch loss = 2.87281,train acc = 0.480607.
Epoch[0],step[21],train batch loss = 2.87278,train acc = 0.480186.
Epoch[0],step[22],train batch loss = 2.87281,train acc = 0.479925.
Epoch[0],step[23],train batch loss = 2.87282,train acc = 0.479617.
Epoch[0],step[24],train batch loss = 2.87282,train acc = 0.479378.
Epoch[0],step[25],train batch loss = 2.87281,train acc = 0.479496.
Epoch[0],step[26],train batch loss = 2.87281,train acc = 0.479354.
Epoch[0],step[27],train batch loss = 2.87282,train acc = 0.479262.
Epoch[0],step[28],train batch loss = 2.87282,train acc = 0.479308.
Epoch[0],step[29],train batch loss = 2.87282,train acc = 0.479182.
Epoch[0],step[30],train batch loss = 2.22282,train acc = 0.478985.
Epoch[0],step[31],train batch loss = nan,train acc = 0.494112.
Epoch[0],step[32],train batch loss = nan,train acc = 0.508811.
Epoch[0],step[33],train batch loss = nan,train acc = 0.523289.
Epoch[0],step[34],train batch loss = nan,train acc = 0.536233.
Epoch[0],step[35],train batch loss = nan,train acc = 0.548851.
Epoch[0],step[36],train batch loss = nan,train acc = 0.561351.
Epoch[0],step[37],train batch loss = nan,train acc = 0.573149.
Epoch[0],step[38],train batch loss = nan,train acc = 0.584382.
Epoch[0],step[39],train batch loss = nan,train acc = 0.595006.
Epoch[0],step[40],train batch loss = nan,train acc = 0.605065.
Epoch[0],step[41],train batch loss = nan,train acc = 0.614475.
Epoch[0],step[42],train batch loss = nan,train acc = 0.623371.
Epoch[0],step[43],train batch loss = nan,train acc = 0.632092.
Epoch[0],step[44],train batch loss = nan,train acc = 0.640199.
Epoch[0],step[45],train batch loss = nan,train acc = 0.647391.
我以前用了完全相同的代码,只是损失函数是tf.nn.sparse_softmax_cross_熵_with_logits()而且一切正常,所以我想我的新损失函数有问题。
我有一个猜测,也许有些批次数据只有一个类别的标签(只有0或1),所以
预测“不”和“预测”
因此将没有数据,但我不知道如何编写代码来验证是否有数据
预测“不”和“预测”
有人能帮我找出问题出在哪里吗?如何改进我的损失函数来避免nan?