Набор обучающих данных содержит всего 364 изображения с 8 классами. Я попытался сделать это без увеличения изображения и на тестовом наборе (156 изображений) получил точность 69%. Но когда я использовал ImageDataGenerator, я получил точность всего 13% на тестовом наборе. Я использовал метод flow_from_dataframe для создания изображений. Кто-нибудь может сказать мне, что я делаю не так? И правильно ли написан код? или метод прогнозирования неверен? или это не увеличение изображений. Кроме того, я проверил, правильно ли отображаются метки. Моя цель - обучить модель как минимум на 3640 изображениях, чтобы каждое изображение имело 10 дополненных изображений. Итак, мой окончательный прогноз может улучшиться. Версия tensorflow - 2.2.0.
Попытка увеличить изображения с помощью flow_from_dataframe
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)
Установка модели VGG16 на генератор поезда с помощью метода model.fit
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)
Прогнозы с использованием метода model.predict
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)