Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在使用tf.keras(Tensorflow 2.0)的分类器训练中,作为损失和度量的二元交叉熵不相同?_Tensorflow_Deep Learning_Neural Network_Tensorflow2.0 - Fatal编程技术网

为什么在使用tf.keras(Tensorflow 2.0)的分类器训练中,作为损失和度量的二元交叉熵不相同?

为什么在使用tf.keras(Tensorflow 2.0)的分类器训练中,作为损失和度量的二元交叉熵不相同?,tensorflow,deep-learning,neural-network,tensorflow2.0,Tensorflow,Deep Learning,Neural Network,Tensorflow2.0,我使用BinaryCrossentropy作为损失和指标之一: model.compile( optimizer=tf.keras.optimizers.Adam(learning_rate=1e-5), loss=tf.keras.losses.BinaryCrossentropy(), metrics=[tf.keras.metrics.BinaryCrossentropy(), tf.keras.metrics.AUC()]) 既然它们是相同的东西,我认为它们

我使用BinaryCrossentropy作为损失和指标之一:

model.compile(
    optimizer=tf.keras.optimizers.Adam(learning_rate=1e-5), 
    loss=tf.keras.losses.BinaryCrossentropy(), 
    metrics=[tf.keras.metrics.BinaryCrossentropy(), tf.keras.metrics.AUC()])
既然它们是相同的东西,我认为它们应该产生相同的结果然而,它们在训练集和验证集上分别显示出略有不同的值。为什么会这样?BinaryCrossentropy在相同的数据上不应该有相同的值吗?

是否可能,损失值是最后一批的损失,而度量值是在历元的所有批次上计算的(平均值?)


我试图在上找到相关信息,但我无法确认。如果使用与损耗和度量相同的函数,通常在深度网络中会看到不同的结果。这通常是由于
浮点精度错误造成的:即使数学方程是等效的,但运算的顺序也不相同,这可能会导致微小的差异

如果你考虑了这两个简单的例子,它将返回相同的结果。 二进制交叉熵作为度量标准:

m.update_state([[0, 1], [0, 0]], [[0.6, 0.4], [0.4, 0.6]])
m.result().numpy()
y_true = [[0., 1.], [0., 0.]]
y_pred = [[0.6, 0.4], [0.4, 0.6]]
bce = tf.keras.losses.BinaryCrossentropy()
bce(y_true, y_pred).numpy()
0.81492424

作为损失的二进制交叉熵:

m.update_state([[0, 1], [0, 0]], [[0.6, 0.4], [0.4, 0.6]])
m.result().numpy()
y_true = [[0., 1.], [0., 0.]]
y_pred = [[0.6, 0.4], [0.4, 0.6]]
bce = tf.keras.losses.BinaryCrossentropy()
bce(y_true, y_pred).numpy()
0.81492424

对于每个批次和历元的计算,计算没有差异,但在训练数据集和验证数据集上的计算有差异。对于val集,它是在整个val数据集的历元结束时计算的。对于列车组:在批次结束时计算,平均值不断更新,直到历代结束

仅当使用样本权重时,度量和损失的计算方法才会改变,存在的不仅仅是精度误差,在您的情况下,您没有定义任何如下的样本权重,否则它将超过浮点精度误差:

sample_weight = np.random.rand(len(y_train))
history = model.fit(X_train_scaled, y_train, epochs=2, sample_weight=sample_weight)
  • 自新纪元开始以来的损失是所有批次损失的平均值 到目前为止还没有见过。每个批次损失是加权实例的总和 损失除以批量大小(不是重量之和,因此 批次损失不是损失的加权平均数)
  • 从历元开始的度量等于 加权实例损失除以迄今为止看到的所有权重之和。 换句话说,它是所有实例损失的加权平均数。 不一样。如果你算一下,你会发现

    loss=metric*样本权重的平均值(加上一些浮点精度误差)


希望这能解释你的问题,快乐学习

@Tyler傲来国主 - 如果我已经回答了你的问题,请接受并投票表决答案,谢谢。我的例子中的差异似乎太大了,不能仅仅因为精度问题。您是否有关于浮点精度误差或其不同计算方法的参考资料?我没有为实例指定任何权重,因此它们应该同样重要。@Tyler傲来国主 - 您可以在Agron编写的书中参考这一点,并转到metrics部分,您将找到参考资料。