Обратите внимание, что log(0)
не определено, поэтому, если когда-либо prediction==0
или prediction==1
, у вас будет NaN.
Чтобы обойти это, обычно добавляют очень маленькое значение epsilon
в значение, переданное tf.log
в любой функции потерь (мы также делаем то же самое при делении, чтобы избежать деления на ноль).Это делает нашу функцию потерь численно стабильной, а значение эпсилона достаточно мало, чтобы быть незначительным с точки зрения любой неточности, которую она вносит в нашу потерю.
Возможно, попробуйте что-то вроде:
#Loss function
def loss(prediction, label):
#with tf.variable_scope("Loss") as Loss_scope:
epsilon = tf.constant(0.000001)
log_pred = tf.log(prediction + epsilon, name='Prediction_Log')
log_pred_2 = tf.log(1-prediction + epsilon, name='1-Prediction_Log')
cross_entropy = -tf.multiply(label, log_pred) - tf.multiply((1-label), log_pred_2)
return cross_entropy
ОБНОВЛЕНИЕ:
Как указывает jdehesa в своих комментариях - функции потерь «из коробки» уже хорошо справляются с проблемой численной стабильности