【问题标题】:How to choose batch_size, steps_per_epoch and epoch with Keras generator如何使用 Keras 生成器选择 batch_size、steps_per_epoch 和 epoch
【发布时间】:2019-10-12 17:10:28
【问题描述】:

我正在针对图像分类问题训练 2 个不同的 CNN(自定义和迁移学习)。 我对两种模型都使用相同的生成器。 数据集包含 5 个类别的 5000 个样本,但不平衡。

这是我正在使用的自定义模型。

def __init__(self, transfer_learning = False, lambda_reg = 0.001, drop_out_rate = 0.1):
    if(transfer_learning == False):
        self.model = Sequential();
        self.model.add(Conv2D(32, (3,3), input_shape = (224,224,3), activation = "relu"))
        self.model.add(MaxPooling2D(pool_size = (2,2)))

        self.model.add(Conv2D(64, (1,1), activation = "relu"))
        self.model.add(MaxPooling2D(pool_size = (2,2)))

        self.model.add(Conv2D(128, (3,3), activation = "relu"))
        self.model.add(MaxPooling2D(pool_size = (2,2)))

        self.model.add(Conv2D(128, (1,1), activation = "relu"))
        self.model.add(MaxPooling2D(pool_size = (2,2)))

        self.model.add(Flatten())

        self.model.add(Dense(512))
        self.model.add(Dropout(drop_out_rate))
        self.model.add(Dense(256))
        self.model.add(Dropout(drop_out_rate))

        self.model.add(Dense(5, activation = "softmax"))

所以我无法理解steps_per_epochbatch_size 之间的关系。 batch_size 是生成器发送的样本数。 但是steps_per_epoch 是完成一个训练epoch 的batch_size 的数量吗? 如果是这样,那么它应该是:steps_per_epoch = total_samples/batch_size

无论我尝试什么值,我总是遇到相同的问题(在两种型号上),val_acc 似乎达到了局部最优。

【问题讨论】:

  • 局部最优通常是由非最优学习率引起的。你试过增加它吗?
  • 不,它不会改变任何东西。
  • 仅通过查看您的 iamge 生成器来告诉您如何优化您的神经网络有点困难。
  • 添加了模型的代码
  • steps_per_epoch 应该对batch_size 没有限制,其中batch_size 控制您将同时训练多少数据 - 通常越大越好,但它会占用 GPU 内存。每个时期的步数限制了模型收敛之前的最大步数。即,一旦您的模型达到阈值或超过steps_per_epoch,时代就会停止。而且一个 epoch 不一定会用完所有数据。

标签: python tensorflow machine-learning keras conv-neural-network


【解决方案1】:

您在这里混合了两个问题。一是如何确定batch_size vs steps_per_epoch;另一个原因是为什么 val_acc 似乎达到了局部最优并且不会继续改进。

(1) 针对问题——batch_size vs steps_per_epoch

策略应该首先将batch_size最大化到内存允许的大小,尤其是当您使用GPU(4~11GB)时。通常 batch_size=32 或 64 应该没问题,但在某些情况下,你必须减少到 8、4 甚至 1。如果没有足够的内存分配,训练代码会抛出异常,所以你知道什么时候停止增加 batch_size。

一旦设置了 batch_size,steps_per_epoch 可以通过 Math.ceil(total_samples/batch_size) 计算。但有时,在使用数据增强时,您可能希望将其设置为大几倍。

(2) 第二个问题——val_acc 达到局部最优,不会继续改进

这是深度学习的关键,不是吗?它使 DL 既令人兴奋又困难重重。 batch_size、steps_per_epoch 和 epoch 的数量在这里没有多大帮助。控制模型执行方式的是模型和超参数(如学习率、损失函数、优化函数等)。

一些简单的技巧是尝试不同的学习率、不同的优化函数。如果您发现模型过度拟合(val_acc 随着 epoch 的增加而下降),如果可能的话,增加样本量总是有帮助的。数据增强在一定程度上有所帮助。

【讨论】:

    【解决方案2】:

    首先,steps_per_epoch = total_samples/batch_size 在一般意义上是正确的。
    tensowflow编写的示例代码如下:

    for epoch in range(training_epochs):
        avg_cost = 0
        total_batch = int(mnist.train.num_examples / batch_size)
    
        for i in range(total_batch):
            batch_xs, batch_ys = mnist.train.next_batch(batch_size)
            feed_dict = {X: batch_xs, Y: batch_ys}
            c, _ = sess.run([cost, optimizer], feed_dict=feed_dict)
            avg_cost += c / total_batch
    
        print('Epoch:', '%04d' % (epoch + 1), 'cost =', '{:.9f}'.format(avg_cost))
    
    print('Learning Finished!')
    

    顺便说一句,虽然它与您的问题并不完全相关。有一些不同的优化器,例如 Stochastic Gradient DescentAdam,因为对于大量数据集,学习需要很长时间。
    它不会每次都学习所有数据。有很多关于这方面的文章。在这里我只留下one

    而且,对于您的val_acc,您的模型似乎有很多卷积层。
    你减少了卷积层的过滤器和最大池化,但是,我认为它太多了。过得怎样?比以前好了吗?

    【讨论】:

    • 它还没有改变任何东西。我正在尝试减少 CL 的数量并降低参数的数量。我确实阅读了您提供的代码。这基本上就是我正在做的,所以我会尝试调整模型。
    猜你喜欢
    • 2018-10-21
    • 2021-02-23
    • 1970-01-01
    • 2019-10-26
    • 2020-10-08
    • 2018-07-01
    • 2021-11-26
    • 1970-01-01
    • 2018-03-30
    相关资源
    最近更新 更多