我假设C1
,C2
等表示卷积层,而P1
表示P2
池化层,FC
表示全连接层。
我们可以像这样计算前向传递所需的内存:
一张图片
如果您正在使用 float32 值,那么按照上面@Alexandru Burlacu 提供的链接,您将拥有:
Input
: 50x50x3 = 7,500 = 7.5K
C1
: 50x50x32 = 80,000 = 80K
P1
: 25x25x32 = 20,000 = 20K
C2
:25x25x64 = 40,000 = 40K
P2
: 12x12x64 = 9,216 = 9.2K <- 这是一个问题(我的近似值在这里是一个非常随意的猜测)。与其使用 50、25、'12.5',不如使用 32 的倍数更有意义。我听说从记忆的角度来看,使用 32 的倍数也更有效。据我所知,这是一个坏主意的原因是 2x2 池不能正确划分空间。如果我错了,请随时纠正我。
FC
: 1x500 = 500 = 0.5K
Output
:1 x 10 = 10 = 0.01K(几乎没有)
总内存:7.5K + 80K + 20K + 40K + 0.5K = 157.2K * 4 字节 = 628.8 KB
这是一张图片。
小批量
如果您使用 64 的 minibatch 大小,那么您一次将其中 64 个读入内存并一起执行操作,像这样按比例放大所有内容:
Input
: 64x50x50x3 = 480,000 = 480K = 0.48M
C1
: 64x50x50x32 = 5,120,000 = 5.12M
P1
: 64x25x25x32 = 1,280,000 = 1.28M
C2
: 64x25x25x64 = 2,560,000 = 2.56M
P2
:64x12x12x64 = 589,824 = 590K = 0.59M
FC
: 64x500 = 32,000 = 32K = 0.032M
Output
:1x10x64 = 640 = 0.64K = 0.00064M(我们不在乎,这很小)
总内存:10M x 4 bytes ~ 40MB(我说的是近似值,因为网站上也有近似值)
编辑:我误读了网站,对不起。
根据该网站,向后传递需要大约三倍,因为需要存储:
每个神经元的激活和相关梯度——它们大小相等;
与参数大小相同的权重(参数)的梯度;
动量的价值,如果你正在使用它;
某种杂记(这部分我没看懂)