通过学习BATCH_SIZE 和epoch,解决内存不足的报错

时间:2024-03-31 22:08:05

训练时出现了这种错误:

RuntimeError: CUDA out of memory. Tried to allocate 20.00 MiB (GPU 0;
6.00 GiB total capacity; 4.22 GiB already allocated; 4.91 MiB free; 85.24 MiB cached)
运行时错误:CUDA内存不足。尝试分配20.00 MiB(GPU 0;总容量6.00 GiB;已分配4.22 GiB;4.91 MiB可用;85.24 MiB缓存)

根据报错判断是内存不足引起的,通过修改batch来让他每次处理的数据少一些。

Batch

在不能将数据一次性通过神经网络的时候,就需要将数据集分成几个batch。

BATCH_SIZE

每批数据量的大小。将影响到模型的优化程度和速度。
batchsize的正确选择是为了在内存效率和内存容量之间寻找最佳平衡。

相对于正常数据集,如果Batch_Size过小,训练数据就会非常难收敛,从而导致拟合程度差。
减小Batch_Size,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
增大Batch_Size
优点:相对处理速度加快,内存利用率提高(所需内存容量增加)。
缺点:要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。

epoch全数据集

**中文:**一个时期。即所有训练样本的一个正向传递和一个反向传递。
1个epoch指用训练集中的全部样本训练一次,此时相当于batchsize 等于训练集的样本数。
为什么要使用多于一个epoch?
在神经网络中传递完整的数据集一次是不够的,而且我们需要将完整的数据集在同样的神经网络中传递多次。但请记住,我们使用的是有限的数据集,并且我们使用一个迭代过程即梯度下降来优化学习过程。
如下图所示。因此仅仅更新一次或者说使用一个epoch是不够的。
【overfitting:过拟合;underfitting:欠拟合】
通过学习BATCH_SIZE 和epoch,解决内存不足的报错
随着epoch数量增加,神经网络中的权重的更新次数也在增加,曲线从欠拟合变得过拟合。

iteration

中文: 迭代次数。1个iteration等于使用batchsize个样本训练一次。

BATCH_SIZE与epoch的关系

举个例子,训练集有1000个样本,batchsize=10,那么:训练完整个样本集需要:100次iteration,1次epoch。
参考地址:https://blog.csdn.net/program_developer/article/details/78597738