我需要同时预测多个类别,因此我将这个问题视为对真实输出中的二进制标签/类别进行非线性回归。
鉴于此,损失函数是每个标签的对数损失之和,然后针对批次中的每个示例进行平均。这里是我的损失函数:
prediction = tf.sigmoid(hidden_out) # 预测输出,从0.0到1.0# 避免极端情况下的无限梯度# 通过将预测从0.005重新映射到0.995:pred = prediction*0.99+0.005 # 对数损失:均值在批次大小上,求和在标签上: loss = tf.reduce_mean( tf.reduce_sum( - labels*tf.log(pred) - (1.0-labels)*tf.log(1.0-pred), reduction_indices=1 ))
我怀疑这里有问题。我正在尝试训练一个带有残差Inception层的深度卷积神经网络。在低学习率下,损失很快就会出现NaN
值。
我的对数损失正确吗?有什么建议吗?
回答:
你可以使用已经为多类逻辑回归实现的损失函数,而不是你自己的损失函数:sigmoid_cross_entropy_with_logits。它被精心设计以避免数值问题。
此外,与其裁剪预测,不如裁剪梯度。参见这里,例如。