【发布时间】:2019-06-03 15:12:43
【问题描述】:
我正在训练一个简单的 CNN,其中 Nt=148 + Nv=37 图像分别用于训练和验证。我使用ImageGenerator.flow_from_directory() 方法是因为我计划将来使用数据增强,但目前我不想要任何数据增强。我只想从磁盘上一张一张地读取图像(每张都只读取一次,这对验证很重要)以避免将它们全部加载到内存中。
但以下内容让我认为正在发生与预期不同的事情:
- 训练和验证准确度达到的值不类似于以 148 或 37 作为分母的分数。实际上,试图从 delta 的因数中估计一个合理的分母,会导致数字远大于 148(大约 534 或 551,见下文 (*) 为什么我认为它们应该是 19 的倍数)和 37
- 验证训练和验证数据集上的所有预测(使用单独的程序,它只读取验证目录一次并且不使用上述生成器),显示了一些不完全正确的失败 (1-val_acc )*Nv 符合我的预期
(*) 最后我发现我用于两者的批量大小都是 19,所以我希望我提供每个 epoch 19*7=133 或 19*8=152 个训练图像和 19 或 38 个图像作为验证在每个纪元结束时设置。
顺便说一句:是否可以将model.fit_generator() 与从ImageGenerator.flow_from_directory() 构建的生成器一起使用来实现:
- 没有数据增强
- 两个生成器应分别将所有图像提供给训练过程和验证过程,每个 epoch 只提供一次
- 洗牌很好,而且实际上是需要的,所以每个时期运行不同
同时,我将自己设置为将批量大小设置为等于验证集长度(即 37)。作为训练集数量的分隔符,我认为它应该计算出数字。
但我仍然不确定以下代码是否达到“完全不增加数据”的要求
valid_augmenter = ImageDataGenerator(rescale=1./255)
val_batch_size = 37
train_generator = train_augmenter.flow_from_directory(
train_data_dir,
target_size=(img_height, img_width),
batch_size=val_batch_size,
class_mode='binary',
color_mode='grayscale',
follow_links=True )
validation_generator = valid_augmenter.flow_from_directory(
validation_data_dir,
target_size=(img_height,img_width),
batch_size=val_batch_size,
class_mode='binary',
color_mode='grayscale',
follow_links=True )
【问题讨论】: