#python #tensorflow #machine-learning #keras #deep-learning
#python #тензорный поток #машинное обучение #keras #глубокое обучение
Вопрос:
Я тестировал разные подходы при построении моделей nn (tensorflow, keras), и я увидел, что во время компиляции модели с метрикой было что-то странное.
Я проверил два способа:
model.compile(
loss=keras.losses.CategoricalCrossentropy(),
optimizer=keras.optimizers.Adam(),
metrics=keras.metrics.Accuracy()
)
и
model.compile(
loss=keras.losses.CategoricalCrossentropy(),
optimizer=keras.optimizers.Adam(),
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>
Это довольно странно, я думал, что «точность» точно такая же, как keras.metrics.Точность ().
По крайней мере, это имеет место в аргументах «потеря» и «оптимизатор», например, «adam» совпадает с keras.optimizers.Адам().
Кто-нибудь знает, почему это так странно или я что-то пропустил?
Редактировать:
Подход с метрикой в [] тоже дает странные результаты:
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>
Комментарии:
1. попробуйте
metrics=[keras.metrics.categorical_accuracy]
Ответ №1:
Когда вы упоминаете 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.
Следовательно, как CategoricalCrossEntropy
и потери, так CategoricalAccuracy
и вычисляется в случае 2. Это основано на нахождении argmax и последующем сравнении одноразовой кодировки. В результате вы видите лучшие значения точности в случае 2 и очень плохие в случае 1.
Таким образом, строка accuracy
не всегда будет означать метрическую функцию Accuracy()
.
Объяснение различных показателей для справки, https://keras.io/api/metrics/accuracy_metrics /
Объяснение аргумента metrics
для справки, https://www.tensorflow.org/api_docs/python/tf/keras/Model#compile
Ответ №2:
Это потому, что вы должны указать свои показатели в списке. Попробуйте это :
model.compile(
loss=keras.losses.CategoricalCrossentropy(),
optimizer=keras.optimizers.Adam(),
metrics=[keras.metrics.Accuracy()]
)
и вы должны получить те же результаты.
Редактировать :
keras.metrics.Accuracy()
вычисляет точность между равенством условия и основной истинностью (см. Документ). В вашем случае вы хотите вычислить точность соответствия в правильном классе. Поэтому вы должны использовать keras.metrics.BinaryAccuracy()
или keras.metrics.CategroicalAccuracy()
в соответствии с вашей проблемой.
Комментарии:
1. Я тоже так думал, но это не решает проблему — я отредактировал свой пост
2. Действительно, я проверил документацию, и Accuracy() вычисляет количество раз, когда метки и pred равны (не совпадают, но имеют одинаковое значение), поэтому точность почти равна 0. Итак, если вы хотите вычислить точность с правильным соответствием метке, вам следует попробовать BinaryAccuracy() (или Категориальную точность ()). Я редактирую свой ответ.