Пару дней go Я обучил Re snet в colab и оценил его с помощью следующего кода:
model.compile(loss= "sparse_categorical_crossentropy",
optimizer = optimizer,
metrics = ["accuracy"]
)
checkpoint_cb = keras.callbacks.ModelCheckpoint(
filepath= checkpoint_path,
save_weights_only = False,
monitor= 'val_pred_loss',
save_best_only= True
)
tensorboard_cb = keras.callbacks.TensorBoard(tensorboard_path)
earlystopping_cb = keras.callbacks.EarlyStopping(patience = 6, monitor="val_pred_loss", min_delta = 0.005)
history = model.fit(
x = train_set,
validation_data = val_set,
validation_steps = 1629//val_b_size,
epochs = epochs,
steps_per_epoch = steps_per_epoch,
callbacks = [checkpoint_cb, tensorboard_cb, earlystopping_cb]
)
best_model = tf.keras.models.load_model(checkpoint_path)
test_set = test_set.batch(17)
print(best_model.evaluate(test_set))
Результат: [0.42691513895988464, 0.8850889205932617]
Модель не имеет каких-либо пользовательских компонентов, это простой re snet с новым GAP и плотными слоями для классификации, при повторном запуске последних 3 строк сегодня я постоянно получал бессмысленную точность [0.42691513895988464, 0.004352692514657974]
. Сначала я подумал, что я что-то изменил в скрипте по ошибке или испортил сохранение и загрузку файла, но потеря CE такая же. Как это возможно?
Изменить: проблема связана с любой загруженной моделью, оценка обученного net непосредственно из ОЗУ работает должным образом
Вот как определяется модель:
base_model = keras.applications.ResNet50( include_top = False,
weights = "imagenet",
input_shape = (448, 448, 3),
)
avg = keras.layers.GlobalAveragePooling2D()(base_model.output) # 14 x 14 x 2048 ->2048
o = keras.layers.Dense(196, activation = "softmax")(avg)
model = keras.Model(inputs=base_model.input, outputs=[o])
Обновление: замена оператора load_model на model .load_weights решает проблему, я все равно хотел бы знать причину.