Модель Keras: оценка () и предикат_классы () дают результаты с различной точностью - PullRequest
1 голос
/ 09 ноября 2019

Я недавно использовал TF2.0. Я обучил простую модель CNN (с последовательным API Keras) для двоичной классификации изображений. Я использовал tf.data.Dataset для загрузки изображений с диска. На самом деле модель получила довольно хорошую точность, с поездом binary_accuracy: 0.9831 и проверкой binary_accuracy: 0.9494.

Попытка оценки модели с использованием model.evaluate (). Это дало двоичную точность 0,9460. Но когда я попытался вычислить двоичную точность вручную, используя функциюgnast_classes (), я получил около 0,384. Я не знаю, в чем была проблема. Пожалуйста, помогите мне.

Я добавил свой код, используемый для компиляции и обучения модели. Также код для оценки моей модели.

train_data = tf.data.Dataset.from_tensor_slices((tf.constant(train_x),tf.constant(train_y)))
val_data = tf.data.Dataset.from_tensor_slices((tf.constant(val_x),tf.constant(val_y)))

train_data = train_data.map(preproc).shuffle(buffer_size=100).batch(BATCH_SIZE)
val_data = val_data.map(preproc).shuffle(buffer_size=100).batch(BATCH_SIZE)

model.compile(optimizer=Adam(learning_rate=0.0001),
              loss='binary_crossentropy',
              metrics=[tf.keras.metrics.BinaryAccuracy()])

checkpointer = ModelCheckpoint(filepath='weights.hdf5', verbose=1, save_best_only=True)

time1 = time.time()
history = model.fit(train_data.repeat(),
                    epochs=EPOCHS,
                    steps_per_epoch=STEPS_PER_EPOCH,
                    validation_data=val_data.repeat(),
                    validation_steps=VAL_STEPS,
                    callbacks=[checkpointer])

29/29 [==============================] - 116s 4s/step - loss: 0.0634 - binary_accuracy: 0.9826 - val_loss: 0.1559 - val_binary_accuracy: 0.9494

Теперь тестирование с невидимыми данными

test_data = tf.data.Dataset.from_tensor_slices((tf.constant(unseen_faces),tf.constant(unseen_labels)))
test_data = test_data.map(preproc).batch(BATCH_SIZE)

model.evaluate(test_data)

9/9 [==============================] - 19s 2s/step - loss: 0.1689 - binary_accuracy: 0.9460

Та же самая модель, когда я пытался вычислить точность с использованием model.predict_classes с тем же набором данных,Результаты прогноза далеки от оценочного отчета. Точность двоичного кода составляет около 38%.

Редактировать 1: Функция предварительной обработки, которую я использовал во время обучения

def preproc(file_path,label):
    img = tf.io.read_file(file_path)
    img = tf.image.decode_jpeg(img)
    img = (tf.cast(img, tf.float32)/127.5) - 1
    return tf.image.resize(img,(IMAGE_HEIGHT,IMAGE_WIDTH)),label

Код ручного прогнозирования

from sklearn.metrics import classification_report

#Testing preprocessing function
def preproc_test(file_path):
    img = tf.io.read_file(file_path)
    img = tf.image.decode_jpeg(img)
    img = (tf.cast(img, tf.float32)/127.5) - 1
    return tf.image.resize(img,(IMAGE_HEIGHT,IMAGE_WIDTH))

unseen_faces = []
unseen_labels = []
for im_path in glob.glob('dataset/data/*'):
    unseen_faces.append(im_path)
    if 'real' in i:
        unseen_labels.append(0)
    else:
        unseen_labels.append(1)

unseen_faces = list(map(preproc_test,unseen_faces))
unseen_faces = tf.stack(unseen_faces)

predicted_labels = model.predict_classes(unseen_faces)

print(classification_report(unseen_labels,predicted_labels,[0,1]))

              precision    recall  f1-score   support

           0       0.54      0.41      0.47        34
           1       0.41      0.54      0.47        26

    accuracy                           0.47        60
   macro avg       0.48      0.48      0.47        60
weighted avg       0.48      0.47      0.47        60


1 Ответ

1 голос
/ 09 ноября 2019

Ваша модель работает хорошо как во время training, так и testing. Точность оценки зависит от прогноза, поэтому, возможно, вы совершаете логическую ошибку при использовании model.predict_classes(). Пожалуйста, проверьте, используете ли вы веса обученной модели, а не какую-либо случайно инициализированную модель при ее оценке.

evaluate: модель выделит эту часть обучающих данных, не будет обучаться на ней и будетоцените потери и любые метрики модели на этих данных в конце каждой эпохи. model.evaluate() для оценки вашей обученной модели. Его выходные данные - это точность или потеря, а не прогноз для ваших входных данных.

predict: генерирует выходные прогнозы для входных выборок. model.predict() на самом деле предсказывает, и его выходные данные являются целевым значением, предсказанным на основе ваших входных данных.

PS: Для проблемы двоичной классификации точность <= 50% хуже, чем случайное предположение. </p>

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