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

时间:2018-11-15 03:15:52

标签: python tensorflow machine-learning keras classification

我已经建立了一个模型来训练对图像是否是某种视频游戏进行分类。我将import sys int(sys.float_info.max) 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 的图像pre-scaled像素划分为两个文件夹(两个二进制类),分别标记为250x2500。这两个类别的数量彼此都在1之内,而且我总共有大约~100张图片。

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

3500

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,损耗,精度高等。

我不确定自己做错了什么,我们将不胜感激。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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