@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)
我会为您指出这篇文章和相应的视频。他们帮助我更好地了解了发生了什么。
注意: 使用网络进行预测所需的内存远远少于训练所需的内存,这有两个原因:
- 进行预测时,我们只会通过网络向前发送图像,而不会向后发送图像(因此我们不会将内存X 3乘以;请参见下文)
- 每个图像有一个预测(因此,我们不需要将一个图像所需的内存乘以批处理大小,因为我们无需在预测中使用批处理)。
处理(要训练的记忆)
- 计算在一幅图像上训练所需的内存
- 将此数字乘以批处理中的图像数量
(记住: 迷你批处理说,我们获取数据的一个子集,计算该子集中每个图像的梯度和误差,然后对它们进行平均并朝平均方向前进。对于卷积,权重和偏差是共享的,但是激活数量乘以批处理中的图像数量。)。
步骤1:存储1张图片
要训练一张图像,您必须为以下内容保留内存:
型号参数:
每层的权重和偏差,它们的梯度和它们的动量变量(如果使用Adam,Adagrad,RMSProp等,则使用优化程序)
要对此内存进行近似估算,请计算存储权重和偏差所需的内存,然后将其乘以3(即“乘以3”),因为我们是说存储权重和偏差所需的内存量(大致)等于梯度和动量变量所需的时间)
方程式:
卷积:
权重(n)=深度(n)*(内核宽度*内核高度)*深度(n-1)
偏差(n)=深度(n)
完全连接(密集)层:
权重(n)=输出(n)*输入(n)
偏差(n)=输出(n)
其中Ñ是当前层和n-1个是上一层,和输出是从FC层输出的数量和输入是输入到FC层的数目(如果先前的层不是完全连接的层,输入的数量等于展平的那一层的大小)。
注意:仅用于权重和偏差的内存,再加上用于激活一幅图像的内存(请参见下文),是预测所需的内存总量(不包括用于卷积的内存开销和其他一些东西)。
(我在这里宽松地使用术语,请多多包涵)
卷积层中的每个卷积都会产生“ 图像中的像素数量 ”激活(即,通过单个卷积传递图像,会得到包含“ m ”个激活的单个特征图,其中“ m ”是来自您的像素的像素数量)图片/输入)。
对于完全连接的层,您产生的激活次数等于输出的大小。
卷积:
激活次数(n)=图片宽度*图片高度*图片编号通道
完全连接(密集)层:
激活(n)=输出(n)
请注意,您输入的内容实际上只是网络开始时的图像。卷积后,它变成了其他东西(特征图)。因此,实际上,将“ image_width”,“ image_height”和“ image_num_channels”分别替换为“ input_width”,“ input_height”和“ layer_depth”。(对于我来说,从图像的角度来看这个概念更容易。)
由于我们还需要存储每一层激活的错误(用于后向传递),因此我们将激活次数乘以2,以获得需要在存储空间中腾出空间的实体总数。激活数量随批次中图像的数量而增加,因此您可以将该数量乘以批次大小。
步骤2:记忆训练批次
将权重和偏差的数量(3倍)和激活次数(2倍批量大小)相加。将此乘以4,即可得到训练批处理所需的字节数。您可以除以1024 ^ 2得到GB的答案。