Оценка Keras внезапно начинает давать неоправданно низкую точность, а потери остаются прежними - PullRequest
0 голосов
/ 04 августа 2020

Пару дней 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 решает проблему, я все равно хотел бы знать причину.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...