我有多个类可以同时预测,因此我将问题看作是对二进制标签/类的非线性回归,我将其作为真输出。
也就是说,损失函数是每个标签的对数损失的总和,然后对批次中的每个例子取平均值。这是我的损失函数:
prediction = tf.sigmoid(hidden_out) # Prediction output, from 0.0 to 1.0
# Avoid infinite gradients for extreme cases
# by remapping the prediction from 0.005 to 0.995:
pred = prediction*0.99+0.005
# Log loss: mean is on batch_size, sum is on labels:
loss = tf.reduce_mean(
tf.reduce_sum(
- labels*tf.log(pred) - (1.0-labels)*tf.log(1.0-pred),
reduction_indices=1
)
)
我怀疑这有什么问题。我正在尝试用剩余的初始层训练一个深度卷积神经网络。在学习率较低的情况下,我会快速获得一些NaN
值。
我的日志丢失是否正确?有什么建议吗?
答案 0 :(得分:1)
您可以使用已经为多类逻辑回归实现的损失而不是损失:sigmoid_cross_entropy_with_logits。它经过精心设计,以避免数字问题。
此外,剪辑渐变可能更好,而不是剪裁预测。例如,请参阅here。