我有一个使用Functional API的Keras神经网络,它具有多个输出和多个损失函数(一些回归,一些多类分类)。我总是会为训练中的至少一个输出设置一个标签,但通常至少会丢失一个。
我正在尝试编写一个自定义分类交叉熵损失函数:
def custom_error_function(y_true, y_pred):
bool_finite = y_true != -1
loss = keras.losses.CategoricalCrossentropy(from_logits=True)
one_hotted = one_hot(np.int(boolean_mask(y_true, bool_finite)), depth=5)
return loss(one_hotted, boolean_mask(y_pred, bool_finite, axis=1))
其中y_pred和y_true应该具有相同的形状([n_samples_in_batch, n_classes(5)]),并且y_true的值为-1
表示缺失。
但是当我运行这个时,我得到
ValueError: in user code:
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/keras/engine/training.py", line 1021, in train_function *
return step_function(self, iterator)
File "/var/folders/pn/c0hwfk8n7q9442628b1g_p1r0000gp/T/ipykernel_13239/802342025.py", line 12, in custom_error_function *
return loss(one_hotted, boolean_mask(y_pred, bool_finite, axis=1))
ValueError: Shapes (5,) and (None, 1) are incompatible
我有点困惑,如果有任何帮助,我将不胜感激。谢谢!问题来自axis=1
中的损失调用,下面应该工作:
def custom_error_function(y_true, y_pred):
bool_finite = y_true != -1
loss = keras.losses.CategoricalCrossentropy(from_logits=True)
return loss(tf.boolean_mask(y_true, bool_finite), tf.boolean_mask(y_pred, bool_finite))