训练数据集仅包含364个具有8个类别的图像。我尝试在不进行图像增强的情况下进行测试,并且在测试集(156张图像)上获得了69%的准确性。但是,当我使用ImageDataGenerator时,测试集的准确度仅为13%。我使用过flow_from_dataframe方法生成图像。有人可以告诉我我做错了吗?以及代码是否正确编写?还是预测方法错误?还是不增加图像。另外,我已经检查并且标签正确映射。我的目的是在至少3640个图像上训练模型,以便每个图像具有10个增强图像。因此,我的最终预测可能会有所改善。 tensorflow的版本是2.2.0。
datagen = ImageDataGenerator(rotation_range=45,width_shift_range=0.3,height_shift_range=0.3,shear_range=0.2,
zoom_range=0.2,fill_mode="nearest",horizontal_flip=True,rescale=1/255.,
preprocessing_function=tf.keras.applications.vgg16.preprocess_input,validation_split=0.2)
train_generator = datagen.flow_from_dataframe(dataframe=df_train, directory=train_dir,x_col='Image',
y_col='target',target_size=(224,224),class_mode='categorical',batch_size=10,subset='training',seed=42)
validation_generator = datagen.flow_from_dataframe(dataframe=df_train, directory=train_dir,x_col='Image',
y_col='target',target_size=(224,224),class_mode='categorical',batch_size=10,subset='validation',seed=42)
test_datagen = ImageDataGenerator(rotation_range=45,width_shift_range=0.3,height_shift_range=0.3,shear_range=0.2,
zoom_range=0.2,channel_shift_range=0.0,fill_mode="nearest",horizontal_flip=True,rescale=1/255.,
preprocessing_function=tf.keras.applications.vgg16.preprocess_input)
test_generator = test_datagen.flow_from_dataframe(dataframe=df_test, directory=test_dir,x_col='Image',
target_size=(224,224),class_mode=None,batch_size=1,seed=42)
IMG_SHAPE=(224,224,3)
def base_model(IMG_SHAPE,CNN_type):
model = CNN_type(input_shape=IMG_SHAPE, include_top=False, weights="imagenet")
model.trainable = False
global_average_layer = GlobalAveragePooling2D()(model.output)
dropout_layer = Dropout(0.4)(global_average_layer)
prediction_layer = Dense(units=8, activation='softmax')(dropout_layer)
model = Model(inputs=model.input, outputs=prediction_layer)
model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["categorical_accuracy"])
return model
model=base_model(IMG_SHAPE,VGG19)
train_steps = train_generator.n//train_generator.batch_size
validation_steps = validation_generator.n//validation_generator.batch_size
history = model.fit(train_generator,steps_per_epoch=train_steps, epochs=100,
validation_data=validation_generator,validation_steps=validation_steps)
STEP_SIZE_TEST=test_generator.n//test_generator.batch_size
test_generator.reset()
pred=model.predict(test_generator,steps=STEP_SIZE_TEST,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]
df_test['target']=predictions
df_test.to_csv('./dataset/data_vgg19_100.csv',index=False)