@StatsSorceress TL;博士:
我正在经历这个活动,看看我是否可以自己计算所需的内存:
激活: 532,752 * 2 * 4 / (1024^2) = 4.06 MB
参数: 19,072,984 * 4 / (1024^2) * 3 = 218.27 MB
其他: 128 * 9,000 * 4 / (1024^2) = 4.39 MB
总内存:(4.06 * 128)+ 218.27 + 4.39 = 742.34 MB
(如果我错了,请有人纠正我。仅供参考,您已经将杂项乘以 128,这就是为什么我没有将其乘以上面的 128 的原因)
我会向您指出这篇文章和相应的视频。他们帮助我更好地了解正在发生的事情。
注意: 使用网络进行预测所需的内存远低于训练所需的内存,原因有两个:
- 预测时,我们只通过网络向前发送图像而不是向后发送(所以我们不将内存乘以 3;见下文)
- 每张图像有一个预测(因此我们不需要将一张图像所需的内存乘以批量大小,因为我们在预测中不使用批量)。
过程(记忆训练)
- 计算在一张图像上训练所需的内存
- 将此数字乘以批次中的图像数量
(记住: 小批量表示我们获取数据的一个子集,计算子集中每个图像的梯度和误差,然后对它们进行平均并朝着平均的方向前进。对于卷积网络,权重和偏差是共享的,但是激活的数量乘以批次中的图像数量。)。
第 1 步:存储 1 张图像
要训练一张图像,您必须为以下内容预留内存:
型号参数:
每层的权重和偏差,它们的梯度,以及它们的动量变量(如果使用 Adam、Adagrad、RMSProp 等,优化器)
为了近似内存,计算存储权重和偏差所需的内存并将其乘以 3(即“乘以 3”,因为我们说存储权重和偏差所需的内存量(大致)等于梯度和动量变量所需的)
方程式:
卷积:
权重(n) = 深度(n) * (kernel_width * kernel_height) * depth(n-1)
偏差(n)=深度(n)
全连接(密集)层:
权重(n)=输出(n)*输入(n)
偏差(n)=输出(n)
其中n是当前层,n-1是前一层,输出是FC层的输出数量,输入是FC层的输入数量(如果前一层不是全连接层,输入的数量等于展平层的大小)。
注意:仅权重和偏差的内存,加上一张图像的激活内存(见下文),就是预测所需的内存总量(不包括卷积和其他一些东西的内存开销)。
(我在这里松散地使用术语,请耐心等待)
卷积层中的每个卷积都会产生“图像中的像素数”激活(即,您通过单个卷积传递图像,您将获得由“ m ”激活组成的单个特征图,其中“ m ”是来自您的图像/输入)。
对于全连接层,您产生的激活数等于输出的大小。
卷积:
激活(n)= image_width * image_height * image_num_channels
全连接(密集)层:
激活(n)=输出(n)
请注意,您的输入实际上只是网络开始时的图像。在卷积之后,它变成了别的东西(特征图)。所以真正将“image_width”、“image_height”和“image_num_channels”替换为“input_width”、“input_height”和“layer_depth”更准确。(我更容易从图像的角度来思考这个概念。)
由于我们还需要存储每一层的激活误差(用于后向传递),我们将激活数乘以 2 以获得我们需要在存储空间中腾出空间的实体总数。激活的数量随着批次中图像的数量而增加,因此您将此数字乘以批次大小。
第 2 步:训练批次的内存
将权重和偏差的数量(乘以 3)和激活的数量(乘以批量大小的 2)相加。将其乘以 4,即可得到训练批次所需的字节数。您可以除以 1024^2 得到 GB 的答案。