Keras 模型评估中的损失
Loss in Keras Model evaluation
我正在用 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']
测试期间loss
的meaning/usage是多少?为什么它这么高(例如 m_acc
中的 0.5690
)?准确性评估对我来说似乎很好(例如 m_acc
中的 0.9523
),但我也担心 loss
,它是否会使我的模型表现不佳?
P.S.
m_acc
、m_recall
等只是我命名模型的方式(它们是根据 GridSearchCV
中的不同指标训练的)
更新:
我刚刚意识到 loss
值不是百分比,那么它们是如何计算的?使用当前值,它们是否足够好,还是我需要进一步优化它们?
也感谢进一步阅读的建议!
在定义机器学习模型时,我们需要一种方法来衡量我们模型的性能,以便我们可以将其与其他模型进行比较以选择最佳模型并确保它足够好。因此,我们定义了一些 指标 ,例如准确度(在分类上下文中),即模型正确分类样本的比例,以衡量我们的模型的性能以及它是否足够好是否完成我们的任务。
虽然这些指标是我们真正可以理解的,但问题是我们模型的学习过程不能直接使用它们来调整模型的参数。相反,我们定义了其他度量,通常称为 loss functions 或 objective functions,可以直接在训练过程中使用(即优化)。这些函数通常被定义为我们期望当它们的值很低时我们会有很高的准确性。这就是为什么您通常会看到机器学习算法试图最小化损失函数并期望提高准确性。换句话说,模型通过优化损失函数间接学习。损失值在模型训练期间很重要,例如如果它们没有减少或波动,那么这意味着某个地方有问题需要修复。
因此,我们最终(即在测试模型时)关心的是我们最初定义的指标(如准确性)的值,而不关心损失函数的最终值。这就是为什么您听不到 "the loss value of a [specific model] on the ImageNet dataset is 8.732" 之类的声音的原因!这并不能告诉你模型是好是坏还是糟糕。相反,您会听到 "this model performs with 87% accuracy on the ImageNet dataset".
我正在用 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']
测试期间loss
的meaning/usage是多少?为什么它这么高(例如 m_acc
中的 0.5690
)?准确性评估对我来说似乎很好(例如 m_acc
中的 0.9523
),但我也担心 loss
,它是否会使我的模型表现不佳?
P.S.
m_acc
、m_recall
等只是我命名模型的方式(它们是根据 GridSearchCV
中的不同指标训练的)
更新:
我刚刚意识到 loss
值不是百分比,那么它们是如何计算的?使用当前值,它们是否足够好,还是我需要进一步优化它们?
也感谢进一步阅读的建议!
在定义机器学习模型时,我们需要一种方法来衡量我们模型的性能,以便我们可以将其与其他模型进行比较以选择最佳模型并确保它足够好。因此,我们定义了一些 指标 ,例如准确度(在分类上下文中),即模型正确分类样本的比例,以衡量我们的模型的性能以及它是否足够好是否完成我们的任务。
虽然这些指标是我们真正可以理解的,但问题是我们模型的学习过程不能直接使用它们来调整模型的参数。相反,我们定义了其他度量,通常称为 loss functions 或 objective functions,可以直接在训练过程中使用(即优化)。这些函数通常被定义为我们期望当它们的值很低时我们会有很高的准确性。这就是为什么您通常会看到机器学习算法试图最小化损失函数并期望提高准确性。换句话说,模型通过优化损失函数间接学习。损失值在模型训练期间很重要,例如如果它们没有减少或波动,那么这意味着某个地方有问题需要修复。
因此,我们最终(即在测试模型时)关心的是我们最初定义的指标(如准确性)的值,而不关心损失函数的最终值。这就是为什么您听不到 "the loss value of a [specific model] on the ImageNet dataset is 8.732" 之类的声音的原因!这并不能告诉你模型是好是坏还是糟糕。相反,您会听到 "this model performs with 87% accuracy on the ImageNet dataset".