我正在使用Keras处理多类图像分类问题。训练和测试图像位于2个单独的文件夹中,即training_set和test_set。我也有2个csv文件train.csv和test.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)
答案 0 :(得分:0)
经过研究,我能够找到问题所在。 flow_from_dataframe
或flow_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)