使用Keras flow_from_dataframe

时间:2018-12-30 06:06:09

标签: pandas keras classification

我正在使用Keras处理多类图像分类问题。训练和测试图像位于2个单独的文件夹中,即training_set和test_set。我也有2个csv文件train.csvtest.csv,其中包含图像的详细信息。我正在使用Keras flow_from_dataframe方法。

我在下面给出了用于此任务的代码。这样得出的交叉验证得分约为75%,但在测试集上,结果却很差(准确性仅为20%)。我知道过度拟合是一种可能,但我也想在下面的代码中我也缺少一些重要的细节(可能是wrt imagedatagenerator)。因为当我尝试使用flow_from_dataframe解决不同的图像分类时,测试集上的结果也很差。

有人可以指导我所缺少的内容或提供指导吗?

model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(64, 64, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())  # this converts our 3D feature maps to 1D feature vectors

model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(6))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

# this is the augmentation configuration we will use for training
train_datagen = ImageDataGenerator(rescale=1./255,
                                   shear_range=0.20,
                                   zoom_range=0.20,
                                   horizontal_flip=True,
                                   vertical_flip=True)

# this is the augmentation configuration we will use for testing:
test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_dataframe(dataframe=train_df,
                                                    directory='train/',
                                                    x_col='image_name',
                                                    y_col='label',
                                                    has_ext=True,
                                                    seed=42,
                                                    target_size=(64, 64),
                                                    batch_size=16,
                                                    shuffle=False,
                                                    class_mode='categorical')

test_generator = test_datagen.flow_from_dataframe(dataframe=test_df,
                                                  directory='test/Test set/',
                                                  x_col='image_name',
                                                  y_col=None,
                                                  has_ext=True,
                                                  target_size=(64, 64),
                                                  class_mode=None,
                                                  batch_size=1,
                                                  shuffle=False, 
                                                  seed=42)

STEP_SIZE_TRAIN=train_generator.n//train_generator.batch_size

model.fit_generator(generator=train_generator,
                    steps_per_epoch=STEP_SIZE_TRAIN,
                    epochs=10)

test_generator.reset()
pred = model.predict_generator(test_generator, verbose=1)
predicted_class_indices = np.argmax(pred, axis=1)
labels = train_generator.class_indices
labels = dict((v,k) for k,v in labels.items())
predictions = [labels[k] for k in predicted_class_indices]

test_df['label'] = pd.DataFrame(data=predictions)
submission_df.to_csv('submission.csv', index=False)

1 个答案:

答案 0 :(得分:0)

经过研究,我能够找到问题所在。 flow_from_dataframeflow_from_directory读取文件的顺序与在文件夹中存储文件的顺序不同。因此,预测在提交中的映射不正确。为解决此问题,我在文件名后附加了零,以便flow_from_dataframe读取文件的顺序与存储在本地系统中的文件匹配。

打印生成器的文件名test_generator.filenames,并将其与os.listdir进行比较。如果您发现文件顺序有所不同,那么我们需要更正它以解决此问题。

使用以下代码重命名文件:

for i in os.listdir(folder):
    filename, extension = (os.path.splitext(i))
    filenumber = filename.zfill(5)
    new_filename = (f'{filenumber}{extension}')
    os.rename(i, new_filename)
相关问题