Python keras.metrics.accurity()和“;“准确度”;
我一直在测试构建nn模型的不同方法(tensorflow、keras),我发现在编译模型的过程中度量有一些奇怪的地方 我选择了两种方式:Python keras.metrics.accurity()和“;“准确度”;,python,tensorflow,machine-learning,keras,deep-learning,Python,Tensorflow,Machine Learning,Keras,Deep Learning,我一直在测试构建nn模型的不同方法(tensorflow、keras),我发现在编译模型的过程中度量有一些奇怪的地方 我选择了两种方式: model.compile( loss=keras.losses.CategoricalCrossentropy(), optimizer=keras.optimizers.Adam(), metrics=keras.metrics.Accuracy() ) 及 第一种方法的结果: Ep
model.compile(
loss=keras.losses.CategoricalCrossentropy(),
optimizer=keras.optimizers.Adam(),
metrics=keras.metrics.Accuracy()
)
及
第一种方法的结果:
Epoch 1/2
1875/1875 - 2s - loss: 0.0494 - accuracy: 0.0020
Epoch 2/2
1875/1875 - 2s - loss: 0.0401 - accuracy: 0.0030
<tensorflow.python.keras.callbacks.History at 0x7f9c00bc06d8>
Epoch 1/2
1875/1875 - 2s - loss: 0.0368 - accuracy: 0.9884
Epoch 2/2
1875/1875 - 2s - loss: 0.0303 - accuracy: 0.9913
<tensorflow.python.keras.callbacks.History at 0x7f9bfd7d35c0>
时代1/2
1875/1875-2s-损耗:0.0494-精度:0.0020
纪元2/2
1875/1875-2s-损耗:0.0401-精度:0.0030
第二种方法的结果:
Epoch 1/2
1875/1875 - 2s - loss: 0.0494 - accuracy: 0.0020
Epoch 2/2
1875/1875 - 2s - loss: 0.0401 - accuracy: 0.0030
<tensorflow.python.keras.callbacks.History at 0x7f9c00bc06d8>
Epoch 1/2
1875/1875 - 2s - loss: 0.0368 - accuracy: 0.9884
Epoch 2/2
1875/1875 - 2s - loss: 0.0303 - accuracy: 0.9913
<tensorflow.python.keras.callbacks.History at 0x7f9bfd7d35c0>
时代1/2
1875/1875-2s-损耗:0.0368-精度:0.9884
纪元2/2
1875/1875-2s-损耗:0.0303-精度:0.9913
这很奇怪,我认为“准确性”与keras.metrics.accurity()完全相同。
至少在参数“loss”和“optimizer”中是这样,例如,“adam”与keras.optimizers.adam()相同。
有人知道为什么这么奇怪或者我错过了什么吗
编辑:
在[]中使用度量的方法也会产生奇怪的结果:
model.compile(
loss=keras.losses.CategoricalCrossentropy(),
optimizer=keras.optimizers.Adam(),
metrics=[keras.metrics.Accuracy()]
)
Epoch 1/2
1875/1875 - 2s - loss: 0.2996 - accuracy: 0.0000e+00
Epoch 2/2
1875/1875 - 2s - loss: 0.1431 - accuracy: 1.8333e-05
<tensorflow.python.keras.callbacks.History at 0x7f9bfd1045f8>
model.compile(
损失=keras.loss.CategoricalCrossentropy(),
optimizer=keras.optimizers.Adam(),
metrics=[keras.metrics.accurity()]
)
纪元1/2
1875/1875-2s-损耗:0.2996-精度:0.0000e+00
纪元2/2
1875/1875-2s-损耗:0.1431-精度:1.8333e-05
这是因为您必须在列表中指定指标。试试这个:
model.compile(
loss=keras.losses.CategoricalCrossentropy(),
optimizer=keras.optimizers.Adam(),
metrics=[keras.metrics.Accuracy()]
)
你应该得到同样的结果
编辑:
keras.metrics.accurity()
计算预测的相等性与基本事实之间的准确性。在您的情况下,您需要在正确的类中计算匹配的准确性。因此,您应该根据您的问题使用keras.metrics.BinaryAccuracy()
或keras.metrics.categroicalcuracy()
。当您提到keras.metrics.Accuracy()时
您明确要求库计算度量精度
,这是多少目标值与预测值之间的简单比较
但是,当您提到字符串精度
时,根据您选择的损失类型,会选择不同的度量标准
。这是Keras文件中提到的
当您传递字符串'accurity'或'acc'时,我们将其转换为tf.keras.metrics.BinaryAccuracy、tf.keras.metrics.categialAccuracy、tf.keras.metrics.sparsecategoricaccuracy中的一个,具体取决于使用的损失函数和模型输出形状。我们还对字符串“crossentropy”和“ce”进行了类似的转换。
因此,由于CategoricalCrossEntropy
是损失,因此在案例2中计算了categoricalaccurity
。这是基于找到argmax,然后比较一个热编码。因此,您在案例2中看到了更好的精度值,在案例1中看到了非常糟糕的精度值
因此字符串accurity
并不总是表示度量函数accurity()
不同指标的解释,以供参考
参数指标的说明
供参考,
我也这么认为,但这并不能解决问题-我编辑了我的帖子,检查了文档和准确性()计算标签和pred相等的次数(不是匹配,而是相同的值),因此准确性几乎等于0。因此,如果您想通过与标签的正确匹配来计算精度,您应该尝试BinaryAccurance()(或Category Accurance())。我编辑我的答案。尝试
metrics=[keras.metrics.category\u accurity]