我的训练集有 970 个样本,验证集有 243 个样本。
在拟合模型以优化 val_acc 时,批量大小和 epoch 数应该有多大?是否有任何基于数据输入大小的经验法则?
由于您有一个非常小的数据集(约 1000 个样本),因此使用 32 的批量大小可能是安全的,这是非常标准的。除非您在数十万或数百万个观察值上进行训练,否则它不会对您的问题产生巨大影响。
要回答您关于 Batch Size 和 Epochs 的问题:
一般来说:较大的批大小会导致训练的更快进展,但并不总是那么快收敛。较小的批量训练速度较慢,但收敛速度更快。这绝对取决于问题。
一般来说,模型会随着训练次数的增加而提高到一定程度。当它们收敛时,它们的准确性将开始趋于稳定。尝试 50 之类的东西,并绘制 epoch 数(x 轴)与精度(y 轴)的关系。你会看到它在哪里变平。
您的数据的类型和/或形状是什么?这些是图像,还是只是表格数据?这是一个重要的细节。
上面的答案很好。每个人都提供了很好的投入。
理想情况下,这是应该使用的批量大小的顺序:
{1, 2, 4, 8, 16} - slow
{ [32, 64],[ 128, 256] }- Good starters
[32, 64] - CPU
[128, 256] - GPU for more boost
n
小时将批量大小加倍,n
取决于数据集的复杂性或大小,直到我达到机器的内存限制,然后尽可能长时间地继续训练尽可能大的批量。
我使用 Keras 对语音数据执行非线性回归。我的每个语音文件都为我提供了文本文件中 25000 行的特征,每行包含 257 个实数值。我使用 100 的批量大小、50 个 epoch 在 Keras 中训练具有 1 个隐藏层的 Sequential
模型。经过 50 个 epoch 的训练,它很好地收敛到一个低 val_loss
。
我使用 Keras 为市场组合建模执行非线性回归。在 Keras 中训练具有 3 个隐藏层的 Sequential 模型时,我在批量大小为 32 且 epochs = 100 时获得了最佳结果。通常批量大小为 32 或 25 是好的,除非您有大型数据集,否则 epochs = 100。在大型数据集的情况下,您可以使用 10 的批量大小和 50 到 100 的 epochs b/w。同样,上述数字对我来说效果很好。
tf.keras.callbacks.EarlyStopping
使用 Keras,您可以使用 tf.keras.callbacks.EarlyStopping,如果监控的损失停止改善,它会自动停止训练。您可以使用参数 patience
允许没有改进的时期。
它有助于找到一个平台,您可以从中继续改进 epoch 的数量,甚至可能足以达到您的目标而无需处理 epoch。
https://i.stack.imgur.com/qCTxz.png
在 this 文章中是这样说的:
随机意味着 1 个样本,少量样本的 mimibatch 批次和批次意味着完整的训练数据集 = 我在这里犯规了
小批量的优点:训练更快,所需的 RAM 更少
缺点:批次越小,梯度估计越不准确
在 this 论文中,他们尝试了 256,512,1024 个批量大小,所有模型的性能都在彼此的标准差内。这意味着批量大小对性能没有任何显着影响。
最后一句话:
如果 RAM 有问题 = 减小批量大小
如果您需要更快地计算 = 减少批量大小
如果较小批次后性能下降 = 增加批次大小
如果你觉得这篇文章有用,请点赞和评论。抽时间跟大家分享一下。谢谢
根据一项研究,经验法则是批量大小和 learning_rates 具有很高的相关性,以实现良好的性能。
下面研究中的高学习率意味着0.001,小学习率是0.0001。
就我而言,例如,对于一百万条记录的数据集,我通常具有 1024 到 2048 的高批量大小,学习率为 0.001(Adam 优化器的默认值)。但是,我还使用了一个循环学习率调度程序,它会在拟合期间更改此值,这是另一个主题。
从研究:
'在本文中,我们比较了使用不同批量大小和不同学习率的 CNN 的性能。根据我们的结果,我们可以得出结论,学习率和批量大小对网络的性能有显着影响。学习率和批量大小之间存在高度相关性,当学习率高时,大批量比小学习率表现更好。我们建议选择学习率低的小批量。实际上,要确定最佳批量大小,我们建议首先尝试较小的批量大小(通常为 32 或 64),同时请记住,小批量大小需要较小的学习率。批量大小的数量应该是 2 的幂,以充分利用 GPU 处理。随后,可以增加批量大小值,直到获得满意的结果。 - https://www.sciencedirect.com/science/article/pii/S2405959519303455
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