我正在尝试在Keras中构建自定义损失函数,但对其工作方式感到困惑。我正在分批训练网络,我不确定损失函数的输出是否应该是与批处理具有相同维数的数组或只是标量。
答案 0 :(得分:2)
如文档keras loss中所述,您可以传递一个函数,该函数为每个数据点返回一个标量,并接受两个参数:y_true(真标签)和y_pred(预测)。
Keras对批次内的样本执行均值,因此输出应仅为单个标量。
答案 1 :(得分:1)
通常会在微型批次的所有尺寸上减少损耗。如果不应用缩减,则将隐式执行(尝试删除tf.reduce_mean
中的custom_loss_function()
并仅返回res
)。例如:
import tensorflow as tf
import numpy as np
def custom_cross_entropy(y_true, y_pred):
res = -y_true*tf.math.log(tf.nn.softmax(y_pred))
return tf.reduce_mean(res, axis=None)
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(2, activation=None))
model.compile(optimizer=tf.keras.optimizers.SGD(0.01),
loss=[custom_cross_entropy],
metrics=['accuracy'])
y_train = np.array([[1, 0], [0, 1]])
x_train = np.random.normal(size=(2, 2))
model.fit(x_train, y_train, epochs=2)
# Epoch 1/2
# 2/2 [==============================] - 0s 13ms/sample - loss: 0.2689 - accuracy: 1.0000
# Epoch 2/2
# 2/2 [==============================] - 0s 2ms/sample - loss: 0.2686 - accuracy: 1.0000