如何建立一个私人网站,vps主机搭建wordpress,做爰网站名称,中铁建设集团门户网官网图像卷积及其计算#xff08;特征图尺寸、参数量、计算量#xff09;
卷积前后特征图尺寸的计算
定义参数如下#xff1a;
输入特征图尺寸#xff1a; WWWWWW卷积核尺寸#xff1a; FFFFFF步长#xff1a; SSS填充的像素数#xff1a;PPP
则有输出特征图尺寸为 NNNN…图像卷积及其计算特征图尺寸、参数量、计算量
卷积前后特征图尺寸的计算
定义参数如下
输入特征图尺寸 W×WW×WW×W卷积核尺寸 F×FF×FF×F步长 SSS填充的像素数PPP
则有输出特征图尺寸为 N×NN×NN×N N(W−F2P)/S1N (W − F 2P )/S1 N(W−F2P)/S1
参数量的计算
卷积层的参数量
卷积的参数量即卷积核的参数量设我们有如下参数
卷积核尺寸KKK前一层的通道数CinC_{in}Cin当前层的卷积核个数CoutC_{out}Cout
单个卷积核的参数量 ParamskernelCin×K2Params_{kernel}C_{in}\times K^2 ParamskernelCin×K2 有 CoutC_{out}Cout 个卷积核故 ParamsconvK2×Cin×CoutParams_{conv} K^2\times C_{in}\times C_{out} ParamsconvK2×Cin×Cout
全连接层的参数量
上面已经说过卷积层的参数量计算方法了那如何计算全连接层的参数量其实和卷积层参数量的计算方法是一样的。我们在进行全连接层的计算之前需要将最后一层卷积得到的特征图展开为一维的向量即 DinH×W×CD_{in}H\times W\times CDinH×W×C 其中 H,W,CH,\ W,\ CH, W, C 是最后一层卷积输出特征图的高宽和通道数DinD_{in }Din 即为本全连接层的输入特征维度又设 DoutD_{out}Dout 为输出特征维度则有 ParamsFCDin×DoutParams_{FC}D_{in}\times D_{out} ParamsFCDin×Dout 可以理解为是一个卷积层我们就是用4096个 7×7×5127\times 7\times 5127×7×512 的卷积核去做卷积。
验证
我们用VGG16 PyTorch来验证我们的公式是否正确。
VGG16的第一个卷积层输入为原图像 224×224×3224\times 224\times 3224×224×3卷积核个数为 646464尺寸为3则根据公式我们有VGG16第一个卷积层的参数量 ParamsconvK2×Cin×Cout32×3×641728Params_{conv} K^2\times C_{in}\times C_{out} 3^2\times 3\times 641728 ParamsconvK2×Cin×Cout32×3×641728 VGG16第一个全连接层的输入维度数为最后一张特征图的尺寸拉直Din7×7×512D_{in}7\times 7\times 512Din7×7×512输出维度数为4046则 ParamsFCDin×Dout4096×4096102760448Params_{FC}D_{in}\times D_{out}4096\times 4096102760448 ParamsFCDin×Dout4096×4096102760448 手动计算好之后我们用PyTorch来打印输出以下看一下
import torch
from torchvision.models import resnet50, vgg16
import numpy as npmodel vgg16()
for name, parameters in model.named_parameters():print(name, :, np.prod(parameters.size()))输出
features.0.weight : 1728
features.0.bias : 64
...
classifier.0.weight : 102760448
classifier.0.bias : 4096计算正确。
卷积的计算量
参考FLOPs、FLOPS、Params的含义及PyTorch中的计算方法
MAC
MACMultiply Accumulate乘加运算。乘积累加运算英语Multiply Accumulate, MAC是在数字信号处理器或一些微处理器中的特殊运算。实现此运算操作的硬件电路单元被称为“乘数累加器”。这种运算的操作是将乘法的乘积结果和累加器的值相加再存入累加器 a←ab×ca\leftarrow ab\times c a←ab×c 使用MAC可以将原本需要的两个指令操作减少到一个指令操作从而提高运算效率。
计算量FLOPs的计算
以下不考虑激活函数的计算量。
卷积层
(2×Ci×K2−1)×H×W×C0(2\times C_i\times K^2-1)\times H\times W\times C_0(2×Ci×K2−1)×H×W×C0
CiC_iCi输入通道数 KKK卷积核尺寸H,WH,WH,W输出特征图空间尺寸CoC_oCo输出通道数。
一个MAC算两个个浮点运算所以在最前面×2\times 2×2。不考虑bias时有−1-1−1有bias时没有−1-1−1。由于考虑的一般是模型推理时的计算量所以上述公式是针对一个输入样本的情况即batch size1。
理解上面这个公式分两步括号内是第一步计算出输出特征图的一个pixel的计算量然后再乘以 H×W×CoH\times W\times C_oH×W×Co 拓展到整个输出特征图。
括号内的部分又可以分为两步(2⋅Ci⋅K2−1)(Ci⋅K2)(Ci⋅K2−1)(2\cdot C_i\cdot K^2-1)(C_i\cdot K^2)(C_i\cdot K^2-1)(2⋅Ci⋅K2−1)(Ci⋅K2)(Ci⋅K2−1)。第一项是乘法运算数第二项是加法运算数因为 nnn 个数相加要加 n−1n-1n−1 次所以不考虑bias会有一个−1-1−1如果考虑bias刚好中和掉括号内变为 2⋅Ci⋅K22\cdot C_i\cdot K^22⋅Ci⋅K2。
全连接层
全连接层 (2×I−1)×O(2\times I-1)\times O(2×I−1)×O
III输入层神经元个数 OOO输出层神经元个数。
还是因为一个MAC算两个个浮点运算所以在最前面×2\times 2×2。同样不考虑bias时有−1-1−1有bias时没有−1-1−1。分析同理括号内是一个输出神经元的计算量拓展到OOO了输出神经元。
可以用 thop 库来验证。
Ref
https://zhuanlan.zhihu.com/p/91277743