我有以下格式的图像列表以及它所属的类:
list.txt
image1 good
image2 good
image3 good
.
.
.
image4 bad
image5 bad
image6 bad
我使用ImageDataGenerator拆分了验证数据:
train_datagen = ImageDataGenerator(rescale=1./255, validation_split = 0.25)
我用熊猫从文件make数据框中读取数据:
load_images = pd.read_csv("list.txt", delim_whitespace = True, header = None)
load_images.columns = ['filename','class']
load_images.columns = load_images.columns.str.strip()
trainDataframe = load_images
我使用flow_from_dataframe创建了训练和验证生成器:
train_generator = train_datagen.flow_from_dataframe(
trainDataFrame,
x_col = 'filename',
y_col = 'class',
directory = path_to_parent_folder_of_images,
target_size=(inputHeight, inputWidth),
batch_size=batch_size,
class_mode='categorical',
subset = 'training',
save_to_dir = "path_to_folder\\training",
shuffle = True)
validation_generator = train_datagen.flow_from_dataframe(
trainDataFrame,
x_col = 'filename',
y_col = 'class',
directory = path_to_parent_folder_of_images,
target_size=(inputHeight, inputWidth),
batch_size=batch_size,
class_mode='categorical',
subset= 'validation',
save_to_dir = "path_to_folder\\validation",
shuffle = True)
最后我训练模型:
model.fit_generator(
train_generator,
steps_per_epoch = train_generator.n // train_generator.batch_size,
epochs = epochs,
validation_data = validation_generator,
validation_steps = validation_generator.n // validation_generator.batch_size,
callbacks = callback_list)
问题是验证集仅包含来自 bad 类的图像。没有其他类别的图片。我已经使用过将图像保存到目录参数,并且只能看到一个类的图像。训练生成器似乎很好(具有好坏的图像)。由于此错误,我的验证精度始终为0或1。我在网上看到了示例,并尝试关注它们。似乎没有人遇到这个问题,所以我不确定自己做错了什么。
我正在使用以下版本: python-3.7.4
tensorflow-2.0.0
喀拉拉邦-2.3.1
答案 0 :(得分:3)
我意识到flow_from_dataframe()从列表中获取前25%的图像,而不是随机选择。由于我的列表是经过排序的,这意味着所有好的类都在一起,而不好的在一起,因此它占用了前25%的图像并将其发送到验证集,并且由于列表已排序,因此它总是将好的图像放入val_set中。我用
from sklearn.utils import shuffle
dataframes = shuffle(dataframes)
随机播放并将其发送到flow_from_dataframe()即可解决问题。