如何在Keras中正确设置steps_per_epoch和validation_steps?

时间:2018-08-16 21:44:42

标签: python tensorflow machine-learning keras deep-learning

我已经在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')

我四处寻找发电机的行为,并找到以下答案: what if steps_per_epoch does not fit into numbers of samples?

我以这种方式计算了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)

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

2 个答案:

答案 0 :(得分:0)

由于Keras数据生成器旨在无限循环,因此steps_per_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),则每个时期您将另外收到一批,其中包含重复的图像。

答案 1 :(得分: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