11

我在 Keras 训练了几个模型。我的训练集中有 39、592 个样本,而我的验证集中有 9、899 个样本。我使用的批量大小为 2。

当我检查我的代码时,我突然想到我的生成器可能丢失了一些数据批次。

这是我的生成器的代码:

train_datagen = ImageDataGenerator(
            rescale=1. / 255,
            shear_range=0.2,
            zoom_range=0.2,
            horizontal_flip=True)

val_datagen = ImageDataGenerator(rescale=1. / 255)

train_generator = train_datagen.flow_from_directory(
            train_dir,
            target_size=(224, 224)
            batch_size=batch_size,
            class_mode='categorical')

validation_generator = val_datagen.flow_from_directory(
            val_dir,
            target_size=(224, 224),
            batch_size=batch_size,
            class_mode='categorical')

我四处搜寻以查看生成器的行为,并找到了答案: 如果 steps_per_epoch 不适合样本数量怎么办?

我以这种方式计算了我的 steps_per_epoch 和 validation_steps:

steps_per_epoch = int(number_of_train_samples / batch_size)
val_steps = int(number_of_val_samples / batch_size)

将此链接中的代码与我自己的批量大小和样本数量一起使用,我得到了以下结果:train_generator 的“缺少最后一批”和 val_generator 的“奇怪的行为”。

恐怕我必须再次重新训练我的模型。我应该为 steps_per_epoch 和 validation_steps 选择什么值?有没有办法为这些变量使用精确值(除了将 batch_size 设置为 1 或删除一些样本)?我还有其他几个样本数量不同的模型,我认为它们都缺少一些批次。任何帮助将非常感激。

两个相关问题:

1-关于我已经训练过的模型,它们是否可靠且经过适当训练?

2- 如果我使用以下值设置这些变量会发生什么:

steps_per_epoch = np.ceil(number_of_train_samples / batch_size)
val_steps = np.ceil(number_of_val_samples / batch_size)

在训练和验证期间,我的模型会在每个 epoch 中多次看到某些图像吗?还是这是我问题的解决方案?!

4

2 回答 2

1

由于 Keras 数据生成器旨在无限循环,因此steps_per_epoch表明您将在单个 epoch 期间从生成器获取新批次的次数。因此,如果您只是采取steps_per_epoch = int(number_of_train_samples / batch_size),您的最后一批将少于batch_size项目并将被丢弃。但是,在您的情况下,每个训练时期丢失 1 张图像并不是什么大问题。验证步骤也是如此。总而言之:您的模型 [几乎 :) ] 训练正确,因为丢失元素的数量很少。

对应于实施ImageDataGenerator https://keras.io/preprocessing/image/#imagedatagenerator-class如果您的步骤数大于预期,在达到最大样本数后,您将从头开始收到新批次,因为您的数据是循环过来。在您的情况下,如果steps_per_epoch = np.ceil(number_of_train_samples / batch_size)您每个时期都会收到一个额外的批次,其中包含重复的图像。

于 2019-06-24T14:43:28.103 回答
0

除了 Greeser 的回答,为了避免丢失一些训练样本,您可以使用此函数计算您的步数:

def cal_steps(num_images, batch_size):
   # calculates steps for generator
   steps = num_images // batch_size

   # adds 1 to the generator steps if the steps multiplied by
   # the batch size is less than the total training samples
   return steps + 1 if (steps * batch_size) < num_images else steps
于 2021-06-24T11:37:50.983 回答