Как keras вычисляет метрики проверки при использовании model.fit()
? Я нашел ответ здесь , но я все еще смущен следующим поведением.
Следуя простому учебнику по тензорному потоку:
# define model
inputs = tf.keras.Input(shape=(784,), name='digits')
x = tf.keras.layers.Dense(64, activation='relu', name='dense_1')(inputs)
x = tf.keras.layers.Dense(64, activation='relu', name='dense_2')(x)
outputs = tf.keras.layers.Dense(10, name='predictions', activation='softmax')(x)
model = tf.keras.Model(inputs=inputs, outputs=outputs)
# compile model
model.compile(
optimizer=tf.keras.optimizers.SGD(learning_rate=1.0),
loss=tf.keras.losses.SparseCategoricalCrossentropy(),
metrics=[
tf.keras.metrics.SparseCategoricalAccuracy(name="accuracy"),
tf.keras.metrics.SparseCategoricalCrossentropy(name="cross")
],
)
# get training data
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train = x_train.reshape(60000, 784).astype('float32') / 255
x_test = x_test.reshape(10000, 784).astype('float32') / 255
y_train = y_train.astype('float32')
y_test = y_test.astype('float32')
x_val = x_train[-10000:]
y_val = y_train[-10000:]
x_train = x_train[:-10000]
y_train = y_train[:-10000]
train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
train_dataset = train_dataset.shuffle(buffer_size=1024).repeat().batch(64)
val_dataset = tf.data.Dataset.from_tensor_slices((x_val, y_val))
val_dataset = val_dataset.batch(64)
test_dataset = tf.data.Dataset.from_tensor_slices((x_test, y_test))
test_dataset = test_dataset.batch(64)
model.fit(train_dataset, epochs=3, steps_per_epoch=1000, validation_data=val_dataset)
Вывод:
Epoch 1/3
1000/1000 [==============================] - 4s 4ms/step - loss: 0.8685 - accuracy: 0.7120 - cross: 0.8685 - val_loss: 0.3464 - val_accuracy: 0.9086 - val_cross: 0.3472
Epoch 2/3
1000/1000 [==============================] - 3s 3ms/step - loss: 0.3269 - accuracy: 0.9082 - cross: 0.3269 - val_loss: 0.2587 - val_accuracy: 0.9298 - val_cross: 0.2598
Epoch 3/3
1000/1000 [==============================] - 3s 3ms/step - loss: 0.2800 - accuracy: 0.9203 - cross: 0.2800 - val_loss: 0.2449 - val_accuracy: 0.9308 - val_cross: 0.2460
В этом примере я установил learning_rate=1
, чтобы значение потерь было равно перекрестной энтропии. Что меня беспокоит, так это то, что val_loss
и val_cross
не совпадают точно, но они действительно должны! Потеря тренировок и перекрестная энтропия тренировок соответствуют друг другу.
Я предполагаю, что val_loss
, который рассчитывается автоматически (для этого вам не нужно передавать метри c), является средним значением для всех пакетов проверки, тогда как cross
- это значение для последней партии в наборе проверки, потому что это показатель, добавленный мной c. У кого-нибудь есть объяснение?
Некоторая документация действительно будет полезна, особенно для такой высокоуровневой функции, как model.fit
. С одним вызовом функции происходит так много всего, что, я думаю, необходима подробная документация.