Saya mencoba melatih model untuk memprediksi gender menggunakan dataset Celeba dan tensorflow. Ini model saya:

train_data_gen = train_image_generator.flow_from_dataframe(
    dataframe=train_split,
    directory=celeba.images_folder,
    x_col='id',
    y_col='Male',
    target_size=(IMG_WIDTH, IMG_HEIGHT),
    batch_size=batch_size,
    classes=['1', '0']
)
base_model = tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE,
                                               include_top=False,
                                               weights='imagenet')
model = tf.keras.Sequential([
    base_model,
    tf.keras.layers.GlobalAveragePooling2D(),
    tf.keras.layers.Dense(512, activation='relu'),
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Dense(2),
    tf.keras.layers.Softmax()
])
base_learning_rate = 0.001
model.compile(optimizer=tf.keras.optimizers.RMSprop(lr=base_learning_rate),
              loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

Kemudian saya menggunakan yang berikut untuk mengevaluasi model

test_data_gen = test_image_generator.flow_from_dataframe(
    dataframe=test_split,
    directory=celeba.images_folder,
    x_col='id',
    y_col='Male',
    target_size=(IMG_WIDTH, IMG_HEIGHT),
    batch_size=batch_size,
    classes=['1', '0']
)
model = tf.keras.models.load_model("cp-0004.ckpt")

# Re-evaluate the model
loss, acc = model.evaluate(test_data_gen, verbose=2)

Yang memberikan akurasi 0,87

Tetapi ketika saya menggunakan yang berikut ini, saya mendapatkan akurasi 0,51!

pred_test = model.predict(test_data_gen)

pred_df = pd.DataFrame(pred_test, columns=["Male", "Female"])
pred_df[pred_df > 0.5] = "1"
pred_df[pred_df < 0.5] = "0"

# test_split_raw = celeba.split('test', drop_zero=False)
confusion_matrix(test_split["Male"].astype(int).values, np.argmax(pred_df.values, 1))

Adakah yang bisa menjelaskan mengapa akurasi dari fungsi evaluasi berbeda?

0
Morty 17 Maret 2020, 20:17

1 menjawab

Jawaban Terbaik

Anda ingin memeriksa test_image_generator.flow_from_dataframe. Nilai default shuffle disetel ke True.

Oleh karena itu, objek generator Anda menghasilkan secara acak dari data pengujian Anda. Model Anda kemudian memprediksi gambar yang dihasilkan secara acak, tetapi Anda membandingkannya dengan kerangka data yang Anda pesan. Jika Anda ingin membandingkan dengan test_split["Male"] setel shuffle ke False. Jika Anda tidak menyetel shuffle ke False, Anda akan selalu mendapatkan akurasi ~0,5 (Jika data Anda terdistribusi secara merata)

Petunjuk lain: Anda harus menggunakan metode .evaluate() jika Anda memiliki data berlabel. Menggunakan .evaluate() juga menghasilkan akurasi. Gunakan .predict() hanya untuk data baru yang tidak berlabel.

1
Jerome Wassmuth 17 Maret 2020, 17:56