使用fit_generator时Keras模型的批处理大小为1

时间:2019-04-23 07:53:19

标签: python tensorflow keras

当我将fit_generator与我的批处理生成器一起使用时,它使用的批处理大小为1,则每个时期的步长为1。我在做什么错了。

我尝试为批处理生成器更改批处理大小参数,但仍然相同。

我的批处理生成器功能:

def batchGenerator(imgs, steerings, batchSize, isTraining):

    while True:
        batchImg = []
        batchSteering = []

        for i in range(batchSize):
            randIndex = random.randint(0, len(imgs) - 1)
            if isTraining:
                img, steering = randomAugment(imgs[randIndex], steerings[randIndex])
            else:
                img = imgs[randIndex]
                steering = steerings[randIndex]

            img = imgPreprocess(img)

            batchImg.append(img)
            batchSteering.append(steering)

        yield (np.asarray(batchImg), np.asarray(batchSteering))

这是我的fit_generator参数:

history = model.fit_generator(batchGenerator(X_train, y_train, 300, 1),
                              steps_per_epoch = 300,
                              epochs = 10,
                              validation_data = batchGenerator(X_valid, y_valid, 200, 0),
                              validation_steps = 200,
                              verbose = 1,
                              shuffle = 1)

当我运行该批处理时,批处理大小似乎为1,因为每个时期都将其递增1。对于每个时期,它都会执行0 / 300、1 / 300、2 / 300、3 / 300等。< / p>

这是怎么回事?

3 个答案:

答案 0 :(得分:0)

您的steps_per_epoch应该始终是训练数据的长度除以batch_size,即在这种情况下为X_train.shape[0]//batch_size

此外,您使用随机索引对数据进行混洗的方式将意味着某些样本可能会被选择一次以上,而某些样本则永远不会被选择。您还可以考虑先随机调整整个训练集,然后再选择顺序的数据进行训练。如果您错过了,我只是想指出这一点。

编辑

def batchGenerator(imgs, steerings, batchsize, isTraining):
    while True:
        start = 0
        end = batchsize

        while start  < len(imgs): 
            x = imgs[start:end]
            y = steerings[start:end]
            if isTraining:            
                x , y = randomAugment(x, y)

            yield x, y

            start += batchsize
            end += batchsize

也许尝试这样的事情。如果可行,您可以稍后处理改组。

答案 1 :(得分:0)

您的生成器没有问题,您的代码也很好。您解释输出的方式是错误的。

从文档中,您可以看到

  

steps_per_epoch:整数或无。声明一个纪元完成并开始下一个纪元之前的总步数(一批样品)。在使用TensorFlow数据张量等输入张量进行训练时,默认值None等于数据集中的样本数除以批量大小;如果无法确定,则默认为1。

通常将steps_per_epochs设置为X_train.shape[0]//batch_size

在培训期间,针对steps_per_epochs个批次进行了培训,并且一个时期被视为已完成。由于数据是以随机顺序获取的,因此没有其他方法可以告诉模型一个纪元已经结束。

在培训期间,您可以看到0/300, 1/300, 2/300, 3/300,依此类推,直到300/300。这很正常。这意味着您的模型是针对300个步骤进行训练的,其中每个步骤的批量大小为300(因为批量大小为300)

如果您将批次大小设置为10,将steps_per_epoch设置为100,则可以在训练1/100, 2/100时看到,依此类推,直到100/100为止,这意味着您的模型已针对{{1 }}个步骤,每个步骤必不可少的是一批100样品

答案 2 :(得分:0)

fit函数相反,fit_generator的输出是批次计数而不是训练示例。因此,增加1表示已处理了另一批。使用steps_per_epoch,您可以定义每个时期要处理的批次。

根据定义,每个训练示例处理一次后,一个纪元结束。这就是为什么人们建议将steps_per_epoch设置为:

steps_per_epoch=number_of_examples//batch_size