Pav*_*v3k 16 python machine-learning deep-learning keras tensorflow
我一直在测试构建神经网络模型(tensorflow、keras)的不同方法,我发现在编译模型期间度量有一些奇怪的地方。
我检查了两种方法:
model.compile(
loss=keras.losses.CategoricalCrossentropy(),
optimizer=keras.optimizers.Adam(),
metrics=keras.metrics.Accuracy()
)
Run Code Online (Sandbox Code Playgroud)
和
model.compile(
loss=keras.losses.CategoricalCrossentropy(),
optimizer=keras.optimizers.Adam(),
metrics=["accuracy"]
)
Run Code Online (Sandbox Code Playgroud)
第一种方法的结果:
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>
Run Code Online (Sandbox Code Playgroud)
第二种方法的结果:
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>
Run Code Online (Sandbox Code Playgroud)
这很奇怪,我认为“准确度”与keras.metrics.Accuracy()完全相同。至少在参数“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>
Run Code Online (Sandbox Code Playgroud)
ran*_*a47 18
当您提到时,keras.metrics.Accuracy()您明确要求库计算指标Accuracy,该指标是有多少目标值与预测值匹配的简单比较。
但是,当您提到该字符串accuracy时,根据您选择的损失类型,会选择不同的字符串Metric。这是Keras的文档中提到的,
When you pass the strings 'accuracy' or 'acc', we convert this to one of tf.keras.metrics.BinaryAccuracy, tf.keras.metrics.CategoricalAccuracy, tf.keras.metrics.SparseCategoricalAccuracy based on the loss function used and the model output shape. We do a similar conversion for the strings 'crossentropy' and 'ce' as well.
因此,在情况 2 中也会计算CategoricalCrossEntropy损失。CategoricalAccuracy这是基于查找 argmax,然后比较 one-hot 编码。因此,您会在情况 2 中看到更好的准确度值,而在情况 1 中看到非常糟糕的准确度值。
所以字符串accuracy并不总是意味着度量函数Accuracy()。
不同metric的解释供参考,https://keras.io/api/metrics/accuracy_metrics/
供参考的参数解释metrics,
https://www.tensorflow.org/api_docs/python/tf/keras/Model#compile
这是因为您必须将指标指定到列表中。尝试这个 :
model.compile(
loss=keras.losses.CategoricalCrossentropy(),
optimizer=keras.optimizers.Adam(),
metrics=[keras.metrics.Accuracy()]
)
Run Code Online (Sandbox Code Playgroud)
你应该得到相同的结果。
编辑 :
keras.metrics.Accuracy()计算预测和真实情况之间的准确性(参见文档)。在您的情况下,您想要计算正确类别中匹配的准确性。所以你应该根据你的问题使用keras.metrics.BinaryAccuracy()或。keras.metrics.CategroicalAccuracy()
| 归档时间: |
|
| 查看次数: |
7343 次 |
| 最近记录: |