【问题标题】:How big should batch size and number of epochs be when fitting a model in Keras?在 Keras 中拟合模型时,批量大小和 epoch 数应该有多大?
【发布时间】:2016-05-05 04:40:48
【问题描述】:

我正在训练 970 个样本并验证 243 个样本。

在 Keras 中拟合模型以优化 val_acc 时,批量大小和 epoch 数应该有多大?是否有任何基于数据输入大小的经验法则可供使用?

【问题讨论】:

  • 我会说这在很大程度上取决于您的数据。如果你只是在玩一些简单的任务,比如 XOR-Classifiers,那么批量大小为 1 的几百个 epoch 就足以获得 99.9% 的准确率。对于 MNIST,我主要经历了合理的结果,批量大小在 10 到 100 左右,并且少于 100 个 epoch。如果没有您的问题、架构、学习规则/成本函数、数据等的详细信息,您将无法准确回答这个问题。
  • 有没有办法在每个训练时期都包含所有数据?
  • @kRazzyR 。实际上,对于每次训练,所有数据都将被视为分批。如果您想一次性包含所有数据,请使用数据长度的批大小。

标签: python machine-learning keras data-science


【解决方案1】:

由于您的数据集非常小(约 1000 个样本),因此使用 32 的批量大小可能是安全的,这是相当标准的。除非您对数十万或数百万个观察结果进行训练,否则它不会对您的问题产生巨大影响。

要回答您关于 Batch Size 和 Epochs 的问题:

一般而言:批量越大,训练进度越快,但收敛速度并不总是那么快。较小的批量训练速度较慢,但​​可以更快地收敛。这绝对取决于问题。

一般而言,模型会随着训练次数的增加而提高到一定程度。当它们收敛时,它们的准确性将开始趋于稳定。尝试 50 之类的东西,并绘制 epoch 数(x 轴)与精度(y 轴)的关系。你会看到它在哪里变平。

您的数据的类型和/或形状是什么?这些是图像,还是只是表格数据?这是一个重要的细节。

【讨论】:

  • 批量大小应该尽可能大而不超出内存。限制批次大小的唯一其他原因是,如果您同时获取下一批并在当前批次上训练模型,您可能会浪费时间获取下一批(因为它太大了,内存分配可能需要大量time) 当模型完成与当前批次的拟合时,在这种情况下,最好更快地获取批次以减少模型停机时间。
  • 我经常看到批量大小的值是 8 的倍数。这种选择有正式的理由吗?
  • 更大的epoch会导致过拟合吗?有更多的数据和更少的时期会导致欠拟合吗?
  • @彼得。这可能会有所帮助stackoverflow.com/questions/44483233/…
【解决方案2】:

上面的答案很好。每个人都给出了很好的意见。

理想情况下,这是应该使用的批量大小的顺序:

{1, 2, 4, 8, 16} - slow 

{ [32, 64],[ 128, 256] }- Good starters

[32, 64] - CPU

[128, 256] - GPU for more boost

【讨论】:

  • 对我来说,这些值非常糟糕。我最终为我的模型使用了 3000 的批量大小,这比您在此处建议的要多。
  • 嗯,有什么来源为什么您将其声明为既定事实吗?
  • 这是在 CNN 模型上使用这些批量大小的引用来源。希望这对你有用。 ~干杯arxiv.org/pdf/1606.02228.pdf#page=3&zoom=150,0,125
  • 这似乎过于简单化了。批量大小通常取决于输入集的每项复杂性以及您正在使用的内存量。以我的经验,我通过逐渐扩展我的批量大小来获得最好的结果。对我来说,我的运气最好从 1 开始,每训练一次 n 小时将批量大小加倍,n 取决于数据集的复杂性或大小,直到我达到机器的内存限制,然后尽可能长时间地继续训练尽可能大的批量。
【解决方案3】:

我使用 Keras 对语音数据执行非线性回归。我的每个语音文件都为我提供了文本文件中 25000 行的特征,每行包含 257 个实数值。我使用 100 的批量大小,50 纪元在 Keras 中训练 Sequential 模型,其中包含 1 个隐藏层。经过 50 个 epoch 的训练后,它很好地收敛到了较低的 val_loss

【讨论】:

    【解决方案4】:

    我使用 Keras 为市场组合建模执行非线性回归。在 Keras 中训练具有 3 个隐藏层的 Sequential 模型时,我在批量大小为 32 且 epochs = 100 时获得了最佳结果。通常批量大小为 32 或 25 是好的,除非您有大型数据集,否则 epochs = 100。在大型数据集的情况下,您可以使用 10 的批量大小和 50 到 100 的 epochs b/w。 上面提到的数字再次对我来说很好。

    【讨论】:

    • 批量大小的值应该是(首选)2 的幂。stackoverflow.com/questions/44483233/…
    • “对于大型数据集,批量大小为 10...”,理解是否正确,即批量大小越大越好,因为梯度是在一个批次上平均的
    【解决方案5】:

    tf.keras.callbacks.EarlyStopping

    使用 Keras,您可以使用 tf.keras.callbacks.EarlyStopping,如果监测到的损失停止改善,它会自动停止训练。您可以使用参数patience 允许没有改进的时期。

    它有助于找到一个平台,您可以从该平台继续细化 epoch 的数量,甚至可能足以达到您的目标而无需处理 epoch。

    【讨论】:

      【解决方案6】:

      Epochs 取决于您的意愿,具体取决于验证损失何时停止进一步改善。这应该是批量大小:

      
      # To define function to find batch size for training the model
      # use this function to find out the batch size
      
          def FindBatchSize(model):
              """#model: model architecture, that is yet to be trained"""
              import os, sys, psutil, gc, tensorflow, keras
              import numpy as np
              from keras import backend as K
              BatchFound= 16
      
              try:
                  total_params= int(model.count_params());    GCPU= "CPU"
                  #find whether gpu is available
                  try:
                      if K.tensorflow_backend._get_available_gpus()== []:
                          GCPU= "CPU";    #CPU and Cuda9GPU
                      else:
                          GCPU= "GPU"
                  except:
                      from tensorflow.python.client import device_lib;    #Cuda8GPU
                      def get_available_gpus():
                          local_device_protos= device_lib.list_local_devices()
                          return [x.name for x in local_device_protos if x.device_type == 'GPU']
                      if "gpu" not in str(get_available_gpus()).lower():
                          GCPU= "CPU"
                      else:
                          GCPU= "GPU"
      
                  #decide batch size on the basis of GPU availability and model complexity
                  if (GCPU== "GPU") and (os.cpu_count() >15) and (total_params <1000000):
                      BatchFound= 64    
                  if (os.cpu_count() <16) and (total_params <500000):
                      BatchFound= 64  
                  if (GCPU== "GPU") and (os.cpu_count() >15) and (total_params <2000000) and (total_params >=1000000):
                      BatchFound= 32      
                  if (GCPU== "GPU") and (os.cpu_count() >15) and (total_params >=2000000) and (total_params <10000000):
                      BatchFound= 16  
                  if (GCPU== "GPU") and (os.cpu_count() >15) and (total_params >=10000000):
                      BatchFound= 8       
                  if (os.cpu_count() <16) and (total_params >5000000):
                      BatchFound= 8    
                  if total_params >100000000:
                      BatchFound= 1
      
              except:
                  pass
              try:
      
                  #find percentage of memory used
                  memoryused= psutil.virtual_memory()
                  memoryused= float(str(memoryused).replace(" ", "").split("percent=")[1].split(",")[0])
                  if memoryused >75.0:
                      BatchFound= 8
                  if memoryused >85.0:
                      BatchFound= 4
                  if memoryused >90.0:
                      BatchFound= 2
                  if total_params >100000000:
                      BatchFound= 1
                  print("Batch Size:  "+ str(BatchFound));    gc.collect()
              except:
                  pass
      
              memoryused= [];    total_params= [];    GCPU= "";
              del memoryused, total_params, GCPU;    gc.collect()
              return BatchFound
      

      【讨论】:

      • 大哎哟......
      猜你喜欢
      • 2017-12-06
      • 2018-04-24
      • 2018-03-12
      • 1970-01-01
      • 2021-05-22
      • 1970-01-01
      • 2017-09-27
      • 2021-07-23
      • 2022-12-20
      相关资源
      最近更新 更多