繁体   English   中英

用于二进制分类预测的Keras的fit_generator()始终为50%

Keras' fit_generator() for binary classification predictions always 50%

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我建立了一个模型来训练对图像是否是某种视频游戏进行分类。 pre-scaled图像pre-scaled250x250像素,并将其分成两个文件夹(两个二进制类),分别标记为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)

model而言,一切似乎都可以正确运行,可以迭代数据,找到正确数量的图像等。但是,尽管验证精度高,损失小,准确性高,但我的预测始终为50%

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

2 个回复

我认为您的问题是您正在使用Sigmoid进行二进制分类,因此最终层激活函数应该是线性的。

问题是您正在使用一个单位的密集层上使用softmax Softmax函数将其输入归一化,以使其元素之和等于1。 因此,如果它具有一个单位,则输出将始终为1。相反,对于二进制分类,您需要使用sigmoid函数作为最后一层的激活函数。

1 是否可以使用 Keras 的 .fit_generator() 来训练和预测用于对象检测的边界框?

我正在做一个项目,需要我使用 keras 来预测边界框坐标(对象检测)。 我正在集思广益,想尝试是否可以修改/使用 keras 的ImageDataGenerator和.fit_generator()来预测边界框? 如果有任何在线链接可以帮助我弄清楚,我将不胜感激。 到目前为止,我还没有在.fit_ ...

5 Keras二进制分类精度停留在50%

我在R中使用keras来构建猫/狗二进制分类器,并使用3000个样本的数据集(1500只猫,1500条狗,9:1训练/测试比例)。 在每个时期,我的分类精度不会超过50%。 感谢您对可能出问题的任何帮助。 我已对我的测试和培训目录进行了三重检查,并且split/testing/Cat/包含150张 ...

10 在Keras中多次调用“ fit_generator()”

我有一个生成器函数,可以生成(输入,目标)元组,并使用fit_generator()方法在其上训练我的模型。 我的数据集分为9个相等部分。 我希望使用fit_generator()方法对数据集进行一次留一法交叉验证,并保持先前​​训练的学习参数不变。 我的问题是,将在模型上多次调用 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM