Как Keras рассчитывает метрики проверки при использовании model.fit ()? - PullRequest
0 голосов
/ 24 марта 2020

Как 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. С одним вызовом функции происходит так много всего, что, я думаю, необходима подробная документация.

1 Ответ

0 голосов
/ 24 марта 2020

Это верно, согласно документации по Tensorflow, при использовании в качестве metri c он сбрасывает свои состояния (вызывает функцию reset_states()) после каждой эпохи / шага и когда используется как убыток , он не сбрасывается, поэтому результат основан на среднем значении всех партий.

...