我试图在Keras中构建一个自定义损失函数,但我对它的工作方式感到困惑。我正在批量训练网络,我不确定损失函数的输出是否应该是与批量维数相同的数组,还是只是一个标量。
发布于 2019-05-27 00:50:31
正如文档keras loss中所述,您可以传递一个函数,该函数为每个数据点返回一个标量,并接受两个参数: y_true (真标签)和y_pred (预测)。
Keras在批处理中执行mean over sample,因此输出应该只是一个标量。
发布于 2019-05-27 00:31:40
在小批量的所有维度上损失通常都会减少。如果不应用return,它将被隐式执行(尝试删除custom_loss_function()
中的tf.reduce_mean
并只返回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
https://stackoverflow.com/questions/56315059
复制相似问题