网站开发打赏功能,WordPress招标采购,重庆景点洪崖洞,上海免费注册公司官网文章目录 前言1.卷积2.参数量的计算2.1案例一2.2案例二 3.奇怪的优化思想3.1使用小核卷积替换大核卷积3.2卷积核11的应用 4.输出图像尺寸的计算4.1Same convolution4.2具体计算规则4.3转置卷积 小结 前言
本篇博客主要介绍卷积基本概念#xff0c;卷积神经网络的参数量计算、… 文章目录 前言1.卷积2.参数量的计算2.1案例一2.2案例二 3.奇怪的优化思想3.1使用小核卷积替换大核卷积3.2卷积核1×1的应用 4.输出图像尺寸的计算4.1Same convolution4.2具体计算规则4.3转置卷积 小结 前言
本篇博客主要介绍卷积基本概念卷积神经网络的参数量计算、参数量优化的一些方法VGG思想1×1卷积核的应用、输出图像尺寸的计算同时也介绍了转置卷积反卷积中该如何计算输出图像的尺寸大小。
1.卷积
在深度学习的世界里卷积操作如同一位默默耕耘的幕后英雄支撑起图像识别、自然语言处理等众多领域的技术突破。无论是识别交通标志的自动驾驶系统还是能理解人类语言的智能助手背后都离不开卷积操作的强大力量。那么卷积操作究竟是什么 从数学角度来看卷积是一种数学运算用于描述两个函数如何通过某种方式相互作用产生一个新的函数。在离散的数字信号处理场景下卷积可以简单理解为两个序列通过特定的乘法和累加运算得到一个新的序列具体计算方式可以总结为8个字翻褶、移位、相乘、相加具体可见我之前博客的介绍卷积演示系统 而在计算机视觉领域卷积与之类似不同的是处理的数据维度略有不同。 以3×3卷积核为例其计算公式可以表示为; g ( x , y ) ∑ i − 1 1 ∑ j − 1 1 f ( x − i ) ( x − j ) ∗ w ( i , j ) g(x,y)\sum_{i-1}^{1}\sum_{j-1}^{1}f(x-i)(x-j)*w(i,j) g(x,y)i−1∑1j−1∑1f(x−i)(x−j)∗w(i,j) 其中w(i,j)表示卷积核f(x,y)输入图像g(x,y)为输出图像。 由于在训练过程中学习的参数是w(i,j)因此加不加入翻褶区别并不大因此在视觉领域一般不对卷积和进行翻褶操作。计算公式为 g ( x , y ) ∑ i − 1 1 ∑ j − 1 1 f ( x i ) ( x j ) ∗ w ( i , j ) g(x,y)\sum_{i-1}^{1}\sum_{j-1}^{1}f(xi)(xj)*w(i,j) g(x,y)i−1∑1j−1∑1f(xi)(xj)∗w(i,j) 这一操作准确来说应该称之为相关操作但视觉领域一般并不区分这两种操作统一称之为卷积操作。
2.参数量的计算
在计算机视觉领域卷积核不仅具有宽和高还具有深度常写成宽度×高度×深度的形式。 卷积核的参数不仅包括核中存储的权值还包括一个偏置值。
2.1案例一
下面通过一个简单的例子介绍如何计算卷积和的参数量这里定义如下网络
import torch.nn as nn
class Net1(nn.Module):def __init__(self):super(Net1, self).__init__()self.conv1 nn.Conv2d(1, 32, 5, padding1)def forward(self, x):x self.conv1(x)return x该网络包括一个卷积层输入通道数为1输出通道数为32卷积核大小为5×5计算该层的参数量。 解释因为输入通道数为1因此卷积核大小可以表示为5×5×1输出通道数为32表明该层使用32个卷积核同时每个卷积核有一个偏置值因此参数量为5×5×1×3232832。 通过代码验证可得 from ptflops import get_model_complexity_infomodel Net1()
ops, params get_model_complexity_info(model, (1, 512, 512), as_stringsTrue,print_per_layer_statFalse, verboseTrue)
params,5*5*1*3232运行结果 这时可以看到卷积操作的参数量核输入图像的尺寸大小无关上述输入图像尺寸为1×512×512如果使用全连接网络的话那么此时输入层的结点个数为512×512262144如果隐含层结点个数为8那么此时全连接网络的参数量为262144×88之所以加8是因为隐含层每个神经元都有一个偏置。 这是可以看到卷积神经网络相对于全连接网络的优势权值共享参数量小。 为什么称权值共享呢因为每个特征图的计算依赖于同一个卷积核。
2.2案例二
为了避免你还未理清如何计算参数量这里再举一个例子网络结构如下
class Net2(nn.Module):def __init__(self):super(Net2, self).__init__()self.conv1 nn.Conv2d(8, 32, 3, padding1)def forward(self, x):x self.conv1(x)return x该网络包括一个卷积层输入通道数为8输出通道数为32卷积核大小为3×3计算该层的参数量。 解释因为输入通道数为8因此卷积核大小可以表示为3×3×8输出通道数为32表明该层使用32个卷积核同时每个卷积核有一个偏置值因此参数量为3×3×8×32322336。 代码验证
model Net2()
ops2, params2 get_model_complexity_info(model, (8, 256, 256), as_stringsTrue,print_per_layer_statFalse, verboseTrue)
params2,3*3*8*3232运行结果
3.奇怪的优化思想
在卷积这一块有很多优化思想来所谓的减少参数量这里主要介绍两种主流思想。
3.1使用小核卷积替换大核卷积
该思想来源于VGG网络的设计思想论文地址VGG网络模型众所周知之所以使用大核卷积是为了获得更大的感受野捕获更大的局部依赖关系。 前提知识使用两个3×3的卷积核的感受野和一个5×5的卷积核的感受野大小一致。 这里我们定义两个网络一个使用小核卷积另一个使用大核卷积假设每个卷积操作前后图像的深度保持不变。 大核卷积网络结构
import torch.nn as nn
class Net1(nn.Module):def __init__(self):super(Net1, self).__init__()self.conv1 nn.Conv2d(32, 32, 5, padding2)def forward(self, x):x self.conv1(x)return x参数量 小核卷积网络结构
class Net3(nn.Module):def __init__(self):super(Net3, self).__init__()self.conv1 nn.Conv2d(32, 32, 3, padding1)self.conv2 nn.Conv2d(32, 32, 3, padding1)self.relu nn.ReLU()def forward(self, x):x self.conv1(x)x self.relu(x)x self.conv2(x)x self.relu(x)return x参数量 从结果来看小核卷积参数量更小但能够和大核卷积达到相同的感受野。这就是为什么越来越多的网络结构使用小核卷积替换大核卷积。
3.2卷积核1×1的应用
这里直接举两个例子来介绍 未使用1×1的卷积核
class Net4(nn.Module):def __init__(self):super(Net4, self).__init__()self.conv1 nn.Conv2d(256, 512, 3, padding1)def forward(self, x):x self.conv1(x)return x参数量 使用1×1卷积核
class Net5(nn.Module):def __init__(self):super(Net5, self).__init__()self.conv1 nn.Conv2d(256, 32, 1)self.conv2 nn.Conv2d(32, 512, 3, padding1)def forward(self, x):x self.conv1(x)x self.conv2(x)return x参数量 从结果来看使用1×1的卷积核减少通道数能够在一定程度上减少参数量但在减少参数量的同时输入的信息量也随之减少如果输入的信息是一个稀疏矩阵的话那么该方法确实适合减少参数量。
4.输出图像尺寸的计算
前面所说都是考虑的是卷积的参数量接着讨论输出图像尺寸如何计算。 卷积主要分为三种Full convolution、Same convolution、valid convolution这里主要介绍用处较多的一种即Same convolution
4.1Same convolution
主要是设置padding参数的值 网络结构
class Net6(nn.Module):def __init__(self):super(Net6, self).__init__()self.conv2 nn.Conv2d(32, 512, 3, paddingsame)def forward(self, x):x self.conv2(x)return x运行测试
import torch
model Net6()
Itorch.randn(32,128,128)
model(I).shape运行结果 解释输入图像的尺寸为32×128×128通过网络结构可以看出该层使用512个卷积核因此输出通道数为512因为padding参数设置的是same输出会保持图像的尺寸大小。 有时并不将其设置为same而是设置一个具体的值这里只是因为设置了same其自动计算了一个具体的值代入进去了而已。
4.2具体计算规则
输出图像的尺寸不仅和填充列数有关还和卷积核大小以及卷积步长有关。具体计算公式如下 W 2 ( W 1 − F 2 P ) S 1 W_2\frac{(W_1-F2P)}{S}1 W2S(W1−F2P)1 H 2 ( H 1 − F 2 P ) S 1 H_2\frac{(H_1-F2P)}{S}1 H2S(H1−F2P)1 其中 W 1 、 H 1 W_1、H_1 W1、H1表示输入图像的尺寸大小 W 2 、 H 2 W_2、H_2 W2、H2表示输出图像的尺寸大小F为卷积核尺寸S为卷积步长P为零填充数量。 下面举一个详细的例子说明。 网络结构为
class Net7(nn.Module):def __init__(self):super(Net7, self).__init__()self.conv2 nn.Conv2d(32, 512, 5, padding1,stride2)def forward(self, x):x self.conv2(x)return x输出结果 解释根据公式计算即可(128-52*1)/2163除法运算一律向下取整。输出通道数和卷积核个数512保持一致因此输出形状为512×63×63。
4.3转置卷积
转置卷积Transposed Convolution又称反卷积Deconvolution具体计算方式也是卷积的逆运算。 由卷积计算公式为 W 2 ( W 1 − F 2 P ) S 1 W_2\frac{(W_1-F2P)}{S}1 W2S(W1−F2P)1 H 2 ( H 1 − F 2 P ) S 1 H_2\frac{(H_1-F2P)}{S}1 H2S(H1−F2P)1 转置卷积与其计算方式相反相当于反函数的关系。 W 1 S × ( W 2 − 1 ) − 2 P F W_1S×(W_2-1)-2PF W1S×(W2−1)−2PF H 1 S × ( H 2 − 1 ) − 2 P F H_1S×(H_2-1)-2PF H1S×(H2−1)−2PF 其中 W 1 、 H 1 W_1、H_1 W1、H1表示输出图像的尺寸大小 W 2 、 H 2 W_2、H_2 W2、H2表示输入图像的尺寸大小F为卷积核尺寸S为卷积步长P为零填充数量。 下面举一个详细的例子说明。
class Net8(nn.Module):def __init__(self):super(Net8, self).__init__()# 转置卷积self.conv_transpose nn.ConvTranspose2d(in_channels32, out_channels16, kernel_size3, stride2, padding1)def forward(self, x):x self.conv_transpose(x)return x输出结果 解释根据公式计算即可2*(128-1)-2*13输出通道数和卷积核个数16保持一致因此输出形状为16×255×255。
小结
通过本篇博客相比你也能够计算卷积神经网络中图像尺寸如何变化的快去找一个深层的网络试试看吧看它的尺寸变化是否和你想的一样呢可以试试本篇博客设计的网络模型——Unet语义分割模型