87

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

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

4

6 回答 6

79

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

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

一般来说:较大的批大小会导致训练的更快进展,但并不总是收敛得那么快。较小的批量训练速度较慢,但​​收敛速度更快。这绝对取决于问题。

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

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

于 2016-07-15T22:43:33.510 回答
21

上面的答案很好。每个人都提供了很好的投入。

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

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

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

[32, 64] - CPU

[128, 256] - GPU for more boost
于 2018-09-08T02:45:30.560 回答
11

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

于 2016-07-19T11:46:59.373 回答
6

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

于 2017-07-04T09:20:48.003 回答
2

tf.keras.callbacks.EarlyStopping

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

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

于 2021-11-29T17:16:28.543 回答
-8

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
于 2019-03-20T15:08:54.007 回答