我是带有 tensorflow 后端的 keras 新手,我正在尝试使用预训练网络进行迁移学习。问题是验证集的准确率非常高,在 90% 左右,但在测试集上的准确率非常差,不到 1%。我使用 opencv 读取和调整图像大小解决了这个问题,但我想了解为什么使用 keras 方法会出现这个问题。我在下面粘贴我的代码。
from keras.preprocessing.image import ImageDataGenerator
from keras.applications.xception import preprocess_input
import keras
train_val_datagen = ImageDataGenerator( validation_split=0.25, preprocessing_function=preprocess_input)
train_val_generator = train_val_datagen.flow_from_directory( # subset di allenamento
directory="./image-dataset/",
target_size=(299, 299),
color_mode="rgb",
batch_size=32,
class_mode="categorical",
shuffle=True,
subset = 'training',
seed=17)
val_train_generator = train_val_datagen.flow_from_directory( # subset di validation
directory="./image-dataset/",
target_size=(299, 299),
color_mode="rgb",
batch_size=32,
class_mode="categorical",
shuffle=True,
subset = 'validation',
seed=17)
final_train_generator = train_val_datagen.flow_from_directory( # set finale di allenamento con tutti i dati
directory="./image-dataset/",
target_size=(299, 299),
color_mode="rgb",
batch_size=32,
class_mode="categorical",
shuffle=True,
seed=17)
如您所见,我使用 Xception 作为预训练网络,我选择调整图像大小以使其适应网络。
训练后,我为测试数据创建了一个新的迭代器,如下所示:
test_datagen = ImageDataGenerator(preprocessing_function=preprocess_input)
test_generator = test_datagen.flow_from_directory(
directory="./TEST/",
target_size=(299, 299),
color_mode="rgb",
batch_size=1, # predico una alla volta
shuffle = False,
class_mode=None # non ce alcuna classe di riferimento
)
test_generator.reset()
其中预处理函数完全相同。
使用以下代码进行预测:
predictions = model_xcpetion.predict_generator(test_generator, 6104, verbose = 1 )
其中 6104 是测试文件夹中的图像数量。在此之后,我生成了一个带有相对分类概率的图像名称的 csv:
import pandas as pd
import numpy as np
df = pd.DataFrame(predictions)
cols =[('probability of' + str(i)) for i in list(range(1, 30 )) ]
df.columns = cols
df['images'] = imNames
df.to_csv('predictions_xception_all_data.csv', sep=',')
其中列代表标签(1 到 29),imNames 是通过 test_generator 的 filenames 属性获得的。最后,我使用具有最高概率值的标签生成了 csv,并计算了获得我之前写的值的准确性。
我用来解决的代码是相同的,但我使用以下代码读取和调整图像大小:
width = 299
height = 299
dim = (width, height)
images = []
# for each img
resized = cv2.resize(img, dim, interpolation = cv2.INTER_AREA)
images.append(resized)
其中“img”是使用 skimage.io 的“imread_collection”读取的所有图像
在此先感谢您的帮助。
EDIT1:使用opencv调整大小的图像尚未使用预处理功能进行处理