Python Keras中自定义损失函数的输出应该是什么?

Python Keras中自定义损失函数的输出应该是什么?,python,tensorflow,keras,conv-neural-network,Python,Tensorflow,Keras,Conv Neural Network,我试图在Keras中构建一个自定义损失函数,但我对它的工作方式感到困惑。我正在批量训练网络,我不确定损失函数的输出是一个与批量维数相同的数组,还是一个标量。在小批量的所有维数上,损失通常都会减少。如果不应用reduce,它将隐式执行(尝试在自定义丢失函数()中删除tf.reduce\u mean,并仅返回res)。例如: 将tensorflow导入为tf 将numpy作为np导入 定义自定义交叉熵(y_真,y_pred): res=-y_true*tf.math.log(tf.nn.softma

我试图在Keras中构建一个自定义损失函数,但我对它的工作方式感到困惑。我正在批量训练网络,我不确定损失函数的输出是一个与批量维数相同的数组,还是一个标量。

在小批量的所有维数上,损失通常都会减少。如果不应用reduce,它将隐式执行(尝试在
自定义丢失函数()中删除
tf.reduce\u mean
,并仅返回
res
)。例如:

将tensorflow导入为tf
将numpy作为np导入
定义自定义交叉熵(y_真,y_pred):
res=-y_true*tf.math.log(tf.nn.softmax(y_pred))
返回tf.reduce_平均值(分辨率,轴=无)
model=tf.keras.models.Sequential()
添加(tf.keras.layers.Dense(2,激活=无))
compile(optimizer=tf.keras.optimizers.SGD(0.01),
损失=[自定义交叉熵],
指标=[‘准确度’])
y_train=np.array([[1,0],[0,1]])
x_序列=np.随机.正常(大小=(2,2))
模型拟合(x_序列,y_序列,历元=2)
#纪元1/2
#2/2[=============================================]0秒13毫秒/样本-损失:0.2689-准确度:1.0000
#纪元2/2
#2/2[====================================]-0s 2ms/样本-损失:0.2686-准确度:1.0000

小批量的所有尺寸的损失通常都会减少。如果不应用reduce,它将隐式执行(尝试在
自定义丢失函数()中删除
tf.reduce\u mean
,并仅返回
res
)。例如:

将tensorflow导入为tf
将numpy作为np导入
定义自定义交叉熵(y_真,y_pred):
res=-y_true*tf.math.log(tf.nn.softmax(y_pred))
返回tf.reduce_平均值(分辨率,轴=无)
model=tf.keras.models.Sequential()
添加(tf.keras.layers.Dense(2,激活=无))
compile(optimizer=tf.keras.optimizers.SGD(0.01),
损失=[自定义交叉熵],
指标=[‘准确度’])
y_train=np.array([[1,0],[0,1]])
x_序列=np.随机.正常(大小=(2,2))
模型拟合(x_序列,y_序列,历元=2)
#纪元1/2
#2/2[=============================================]0秒13毫秒/样本-损失:0.2689-准确度:1.0000
#纪元2/2
#2/2[====================================]-0s 2ms/样本-损失:0.2686-准确度:1.0000

如文档中所述,您可以传递一个函数,该函数为每个数据点返回一个标量,并采用两个参数:y_true(真标签)和y_pred(预测)


Keras在批处理中执行“样本平均数”,因此输出应该只是一个标量。

如文档中所述,您可以传递一个函数,该函数为每个数据点返回一个标量,并采用两个参数:y_true(真标签)和y_pred(预测)


Keras在批内执行样本的平均值,因此输出应仅为单个标量。

它应返回每个样本的损失值。然后,Keras负责每批次这些值的减少。这篇文章中有一个详细的描述:它应该返回每个样本的损失值。然后,Keras负责每批次这些值的减少。这篇文章中有一个详细的描述: