数据增强期间的 Keras CONV 训练似乎显示了错误的批量大小和训练示例数量

Posted

技术标签:

【中文标题】数据增强期间的 Keras CONV 训练似乎显示了错误的批量大小和训练示例数量【英文标题】:Keras CONV training during data augmentation appears to be displaying the wrong batch size and number of training examples 【发布时间】:2017-12-08 23:32:26 【问题描述】:

我正在学习如何使用 Keras 和 CIFAR-10 数据集实现数据增强。我正在借助在线教程和本书Deep learning with Keras.

代码的具体细节是here。

这是我的问题,我确信这与我的一些误解有关:

这是我的 CONV 设置。

 IMG_CHANNELS = 3
 IMG_ROWS = 32
 IMG_COLS = 32
 BATCH_SIZE = 128
 NB_EPOCH = 50
 NB_CLASSES = 10
 VERBOSE = 1
 VALIDATION_SPLIT = 0.2
 OPTIM = RMSprop()

加载数据集,转换为分类、浮点和规范化:

(X_train, y_train), (X_test, y_test) = cifar10.load_data()
Y_train = np_utils.to_categorical(y_train, NB_CLASSES)
Y_test = np_utils.to_categorical(y_test, NB_CLASSES) 
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255

创建生成器

datagen = ImageDataGenerator(
        featurewise_center=False,  # set input mean to 0 over the dataset
        samplewise_center=False,  # set each sample mean to 0
        featurewise_std_normalization=False,  # divide inputs by std of the dataset
        samplewise_std_normalization=False,  # divide each input by its std
        zca_whitening=False,  # apply ZCA whitening
        rotation_range=0,  # randomly rotate images in the range (degrees, 0 to 180)
        width_shift_range=0.1,  # randomly shift images horizontally (fraction of total width)
        height_shift_range=0.1,  # randomly shift images vertically (fraction of total height)
        horizontal_flip=True,  # randomly flip images
        vertical_flip=False)  # randomly flip images
 datagen.fit(X_train)

训练模型(我没有列出模型)

model.fit_generator(datagen.flow(X_train, Y_train,
                   batch_size=BATCH_SIZE),
                   samples_per_epoch=X_train.shape[0],
                   nb_epoch=NB_EPOCH, 
                   verbose=VERBOSE)

我的问题是,当我训练时,会显示以下内容:

 Epoch 1/40
 390/390 [==============================] - 199s - loss: 0.9751 - acc: 0.6588 

我不明白为什么我会收到 390 个示例。 Samples_per_epoch 等于 X_train.shape[0] ,即 50000,批量大小为 128,所以我认为它应该以 128 个批次增加到 50000。

【问题讨论】:

【参考方案1】:

进度条显示的不是样本数量,而是步骤或批次的数量(当您使用model.fit 而不是model.fit_generator 时,它会自动显示样本)。每批包含128个样本,总共有50,000个样本。 50,000/128 = 390.625。这就是为什么你看到的是 390 而不是 50,000。

因为您使用的是model.fit_generator,所以无法显示样本总数。除非您将 batch_size 设置为 1。原因是生成器将无限期循环其数据,直到达到 steps_per_epochssamples_per_epoch 阈值 (*)。

顺便说一句,您可以在model.fit 中使用回调ProgbarLogger 更改此设置,请查看here。

【讨论】:

这是我的猜测,但出于某种奇怪的原因,这本书有一个显示过程的数字,它显示 50000。你确定吗? 是的,我编辑了我的问题。您可以使用ProgbarLogger 回调更改进度条,以便更新每个样本。 我在拟合模型之前添加了这个(并使用了“样本”和“步骤”),它没有任何影响...... 很可能是因为您使用的是 model.fit_generator 而不是 model.fit。让我测试一下! 更新了答案。如果您想看到相同的进度条,请将 batch_size 更改为 1。如果您想拥有更快的模型,请不要这样做。如果我查看您提供的代码的链接。我可以看到他们使用 model.fit 而不是 model.fit_generator(第 92 行),这可以解释进度条的差异。

以上是关于数据增强期间的 Keras CONV 训练似乎显示了错误的批量大小和训练示例数量的主要内容,如果未能解决你的问题,请参考以下文章

在 Keras 的批量训练期间显示每个 epoch 的进度条

Keras 误解了训练数据的形状

Keras 模型似乎不起作用

518大创基础知识学习

深度学习入门,Keras Conv2D类参数详解

keras训练函数fit和fit_generator对比,图像生成器ImageDataGenerator数据增强