稀疏分类交叉熵导致 NAN 损失
Sparse Categorical CrossEntropy causing NAN loss
所以,我一直在尝试实现一些自定义损失,所以我认为我应该从实现 SCE 损失开始,而不使用内置的 TF 对象。这是我为它编写的函数。
def custom_loss(y_true, y_pred):
print(y_true, y_pred)
return tf.cast(tf.math.multiply(tf.experimental.numpy.log2(y_pred[y_true[0]]), -1), dtype=tf.float32)
y_pred是概率集合,y_true是正确的索引。这个设置应该根据我读过的所有内容工作,但它 returns NAN 损失。
我检查了训练循环是否有问题,但它与内置损失完美结合。
有人能告诉我这段代码有什么问题吗?
您可以按如下方式复制 SparseCategoricalCrossentropy()
损失函数
import tensorflow as tf
def sparse_categorical_crossentropy(y_true, y_pred, clip=True):
y_true = tf.convert_to_tensor(y_true, dtype=tf.int32)
y_pred = tf.convert_to_tensor(y_pred, dtype=tf.float32)
y_true = tf.one_hot(y_true, depth=y_pred.shape[1])
if clip == True:
y_pred = tf.clip_by_value(y_pred, 1e-7, 1 - 1e-7)
return - tf.reduce_mean(tf.math.log(y_pred[y_true == 1]))
请注意,SparseCategoricalCrossentropy()
损失函数对预测概率应用小偏移量 (1e-7
) 以确保损失值始终是有限的,另请参阅 .
y_true = [1, 2]
y_pred = [[0.05, 0.95, 0.0], [0.1, 0.8, 0.1]]
print(tf.keras.losses.SparseCategoricalCrossentropy()(y_true, y_pred).numpy())
print(sparse_categorical_crossentropy(y_true, y_pred, clip=True).numpy())
print(sparse_categorical_crossentropy(y_true, y_pred, clip=False).numpy())
# 1.1769392
# 1.1769392
# 1.1769392
y_true = [1, 2]
y_pred = [[0.0, 1.0, 0.0], [0.0, 1.0, 0.0]]
print(tf.keras.losses.SparseCategoricalCrossentropy()(y_true, y_pred).numpy())
print(sparse_categorical_crossentropy(y_true, y_pred, clip=True).numpy())
print(sparse_categorical_crossentropy(y_true, y_pred, clip=False).numpy())
# 8.059048
# 8.059048
# inf
所以,我一直在尝试实现一些自定义损失,所以我认为我应该从实现 SCE 损失开始,而不使用内置的 TF 对象。这是我为它编写的函数。
def custom_loss(y_true, y_pred):
print(y_true, y_pred)
return tf.cast(tf.math.multiply(tf.experimental.numpy.log2(y_pred[y_true[0]]), -1), dtype=tf.float32)
y_pred是概率集合,y_true是正确的索引。这个设置应该根据我读过的所有内容工作,但它 returns NAN 损失。
我检查了训练循环是否有问题,但它与内置损失完美结合。
有人能告诉我这段代码有什么问题吗?
您可以按如下方式复制 SparseCategoricalCrossentropy()
损失函数
import tensorflow as tf
def sparse_categorical_crossentropy(y_true, y_pred, clip=True):
y_true = tf.convert_to_tensor(y_true, dtype=tf.int32)
y_pred = tf.convert_to_tensor(y_pred, dtype=tf.float32)
y_true = tf.one_hot(y_true, depth=y_pred.shape[1])
if clip == True:
y_pred = tf.clip_by_value(y_pred, 1e-7, 1 - 1e-7)
return - tf.reduce_mean(tf.math.log(y_pred[y_true == 1]))
请注意,SparseCategoricalCrossentropy()
损失函数对预测概率应用小偏移量 (1e-7
) 以确保损失值始终是有限的,另请参阅
y_true = [1, 2]
y_pred = [[0.05, 0.95, 0.0], [0.1, 0.8, 0.1]]
print(tf.keras.losses.SparseCategoricalCrossentropy()(y_true, y_pred).numpy())
print(sparse_categorical_crossentropy(y_true, y_pred, clip=True).numpy())
print(sparse_categorical_crossentropy(y_true, y_pred, clip=False).numpy())
# 1.1769392
# 1.1769392
# 1.1769392
y_true = [1, 2]
y_pred = [[0.0, 1.0, 0.0], [0.0, 1.0, 0.0]]
print(tf.keras.losses.SparseCategoricalCrossentropy()(y_true, y_pred).numpy())
print(sparse_categorical_crossentropy(y_true, y_pred, clip=True).numpy())
print(sparse_categorical_crossentropy(y_true, y_pred, clip=False).numpy())
# 8.059048
# 8.059048
# inf