Оценка тензорного потока 2 несовместима с sklearn precision_score - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь обучить модели прогнозировать пол, используя набор данных Celeba и тензорный поток. Это моя модель:

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'])

Затем я использую следующее для оценки модели

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)

, которая дает точность 0,87

Но когда я использую следующее, Я получаю точность 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))

Кто-нибудь может объяснить, почему точность функции оценки отличается?

1 Ответ

1 голос
/ 17 марта 2020

Вы хотите проверить test_image_generator.flow_from_dataframe . Значение по умолчанию shuffle установлено на True .

Таким образом, ваш генераторный объект случайным образом дает результаты ваших тестовых данных. Затем ваша модель прогнозирует эти случайно сгенерированные изображения, но вы сравниваете их с упорядоченным кадром данных. Если вы хотите сравнить с test_split ["Male"], установите shuffle в False . Если вы не установите shuffle на False , вы всегда получите ~ 0,5 точности (если ваши данные распределены поровну)

Еще один совет: вам следует использовать. метод define (), если вы пометили данные. Использование .evaluate () также дает точность. Используйте .predict () только для новых непомеченных данных.

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