Keras模型评估中的损失

Lon*_*ong 3 machine-learning keras loss-function

我正在用Keras进行二进制分类 loss='binary_crossentropy'optimizer=tf.keras.optimizers.Adam最后一层是keras.layers.Dense(1, activation=tf.nn.sigmoid)

据我所知,loss价值是在训练阶段用来评估模型的。但是,当我Keras测试数据集使用模型评估时(例如m_recall.evaluate(testData,testLabel),也有一些loss值,并附带accuracy以下输出所示的值)

test size:  (1889, 18525)
1889/1889 [==============================] - 1s 345us/step
m_acc:  [0.5690245978371045, 0.9523557437797776]
1889/1889 [==============================] - 1s 352us/step
m_recall:  [0.24519687695911097, 0.9359449444150344]
1889/1889 [==============================] - 1s 350us/step
m_f1:  [0.502442331737344, 0.9216516675489677]
1889/1889 [==============================] - 1s 360us/step
metric name:  ['loss', 'acc']
Run Code Online (Sandbox Code Playgroud)

loss测试期间的意义/用途是什么?为什么它是如此之高(如0.5690m_acc)?准确度评估对我来说似乎不错(例如,0.9523在中m_acc),但我也很担心loss,这是否会使我的模型表现不佳?

PS m_accm_recall等等都只是我的名字我的模型的方法(它们是由不同的指标受训GridSearchCV

更新: 我只是意识到loss值不是百分比,那么如何计算?使用当前值,它们是否足够好,还是需要对其进行更多优化?

对于进一步阅读的建议也表示赞赏!

tod*_*day 6

在定义机器学习模型时,我们希望有一种方法来衡量模型的性能,以便我们可以将其与其他模型进行比较以选择最佳模型,并确保模型足够好。因此,我们定义了一些度量标准,例如准确性(在分类的上下文中),该度量标准是模型正确分类的样本的比例,以衡量模型的性能以及该模型是否足以完成任务。

尽管这些指标对我们来说确实是可以理解的,但是问题是我们的模型的学习过程无法直接使用它们来调整模型的参数。相反,我们定义其他度量,通常称为损失函数目标函数,可以直接由训练过程使用(即优化)。通常定义这些函数,以便我们期望当它们的值较低时,我们将具有较高的精度。这就是为什么您通常会看到机器学习算法在期望精度提高的情况下试图最小化损失函数的原因。换句话说,模型是间接学习的通过优化损失函数。损失值在模型训练期间很重要,例如,如果损失值没有减少或波动,那么这意味着需要解决某个问题。

结果,我们最终(即在测试模型时)关心的是我们最初定义的度量值(如准确性),我们不在乎损失函数的最终值。这就是为什么您不会听到“ ImageNet数据集上[特定模型] 的损失值为 8.732”之类的原因!这并不能告诉您模型的好坏,好坏。相反,您会听到“此模型在ImageNet数据集上的准确度为87%”。

  • @Long 请注意,我们仍然可以比较相同任务的相同损失函数的值(尽管以受限的方式)。有人可能有兴趣知道测试数据集上的损失值是多少。所以这并不完全没有必要。但是,如果您的目标是比较模型的性能,您将主要依赖指标的值而不是损失函数。此外,比较不同损失函数的值并不容易甚至不明智。例如,将均方误差的值与二元交叉熵进行比较是没有意义的。 (2认同)
  • @Long 它们是具有不同输出范围的不同功能。正如我所说,在测试阶段,您应该更加关注指标值(如准确性)。在训练阶段,您应该只监控损失函数值的**趋势**(即它是减少、固定还是增加),同时还要关注指标的值。 (2认同)