python - Keras 的 fit_generator() 用于二元分类预测始终为 50%

标签 python tensorflow machine-learning keras classification

我建立了一个模型来训练分类图像是否是某个视频游戏。我将图像预缩放250x250像素,并将它们分成两个文件夹(两个二进制类),分别标记为01 。两个类的数量相差在 ~100 之内,我总共有大约 3500 图像。

以下是训练过程、模型设置和一些预测的照片:https://imgur.com/a/CN1b6LV

train_datagen = ImageDataGenerator(
    rescale=1. / 255,
    shear_range=0,
    zoom_range=0,
    horizontal_flip=True,
    width_shift_range=0.1,
    height_shift_range=0.1,
    validation_split=0.2)
train_generator = train_datagen.flow_from_directory(
    'data\\',
    batch_size=batchsize,
    shuffle=True,
    target_size=(250, 250),
    subset="training",
    class_mode="binary")
val_generator = train_datagen.flow_from_directory(
    'data\\',
    batch_size=batchsize,
    shuffle=True,
    target_size=(250, 250),
    subset="validation",
    class_mode="binary")
pred_datagen = ImageDataGenerator(
    rescale=1. / 255,
    shear_range=0,
    zoom_range=0,
    horizontal_flip=False,
    width_shift_range=0.1,
    height_shift_range=0.1)
pred_generator = pred_datagen.flow_from_directory(
    'batch_pred\\',
    batch_size=30,
    shuffle=False,
    target_size=(250, 250))


model = Sequential()
model.add(Conv2D(input_shape=(250, 250, 3), filters=25, kernel_size=3, activation="relu", padding="same"))
model.add(Conv2D(filters=32, kernel_size=3, activation="relu", padding="same"))
model.add(Conv2D(filters=32, kernel_size=3, activation="relu", padding="same"))
model.add(MaxPooling2D(pool_size=2,  padding="same", strides=(2, 2)))
model.add(BatchNormalization())
model.add(Conv2D(filters=64, kernel_size=3, activation="relu", padding="same"))
model.add(Conv2D(filters=64, kernel_size=3, activation="relu", padding="same"))
model.add(Conv2D(filters=64, kernel_size=3, activation="relu", padding="same"))
model.add(MaxPooling2D(pool_size=2, padding="same", strides=(2, 2)))
model.add(BatchNormalization())
model.add(Conv2D(filters=128, kernel_size=3, activation="relu", padding="same"))
model.add(Conv2D(filters=128, kernel_size=3, activation="relu", padding="same"))
model.add(Conv2D(filters=128, kernel_size=3, activation="relu", padding="same"))
model.add(MaxPooling2D(pool_size=2, padding="same", strides=(2, 2)))
model.add(Conv2D(filters=256, kernel_size=3, activation="relu", padding="same"))
model.add(Conv2D(filters=256, kernel_size=3, activation="relu", padding="same"))
model.add(Conv2D(filters=256, kernel_size=3, activation="relu", padding="same"))
model.add(MaxPooling2D(pool_size=2, padding="same", strides=(2, 2)))
model.add(BatchNormalization())
dense = False
if dense:
    model.add(Flatten())
    model.add(Dense(250, activation="relu"))
    model.add(BatchNormalization())
    model.add(Dense(50, activation="relu"))
else:
    model.add(GlobalAveragePooling2D())
model.add(Dense(1, activation="softmax"))
model.compile(loss='binary_crossentropy',
              optimizer=Adam(0.0005), metrics=["acc"])
callbacks = [EarlyStopping(monitor='val_acc', patience=200, verbose=1),
             ModelCheckpoint(filepath="model_checkpoint.h5py",
                             monitor='val_acc', save_best_only=True, verbose=1)]
model.fit_generator(
      train_generator,
      steps_per_epoch=train_generator.samples // batchsize,
      validation_data=val_generator,
      validation_steps=val_generator.samples // batchsize,
      epochs=500,
      callbacks=callbacks)

模型按纪元迭代数据、找到正确数量的图像等而言,一切似乎都运行正确。但是,我的预测始终是50%尽管具有良好的验证准确性、低损失、高精度等特点。

我不确定我做错了什么,任何帮助将不胜感激。

最佳答案

我认为你的问题是你使用 sigmoid 进行二元分类,你的最后一层激活函数应该是线性的。

关于python - Keras 的 fit_generator() 用于二元分类预测始终为 50%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53311885/

相关文章:

python - 将字典压缩成字典的字典

python - 当源模型返回 `removeRows()` 时,自定义代理模型崩溃

python - NumPy 数组元素未更新

python - Python 中基于时间的 for 循环

随机森林 : how to get 100%-Precision?

python - 如何计算多类图像分割的多类骰子系数?

python - 无法将形状 (20,310,310) 中的输入数组广播到形状 (20)

python - Keras ImageDataGenerator 中的增强

python - 将目录中的图像作为 Tensorflow 数据集加载

machine-learning - LSTM注意力如何具有可变长度输入