一、视觉处理常用的领域介绍
常见的视觉处理网络中,大家熟知的主要为Convolutional Neural Network(CNN),也称视觉神经网络。特点主要为在深度学习网络中采用conv的方式对图像进行卷积操作,进行图像的特征提取,最后采用flatten的方式全连接进行概率预测,从而达到图像目标的分类、目标检测、图像分割等相关工作。
注:在深度学习网络中为什么采用卷积的形式提取特征,而不采用全连接的方式提取特征?
在常规的全连接深度学习网络框架中,采用Y = w * x + b的方式进行线性计算,对线性公式进行激活从而完成一次深度学习与全连接操作。则当输入维度不变,输出维度由10变成100时,需要计算的参数量将同样会扩大10倍。极易造成参数量巨大,导致计算缓慢。
而采用卷积操作时,只需要根据输出维度添加对应的卷积核,极大的降低参数量。
同时,线性表达虽增加了激活函数,增加模型的非线性表达能力,但因参数量巨大,学习量大,学习效率低。
CNN 构成的主要模块有 卷积层、池化层、全连接层。三部分构成。
二、卷积层
卷积层为CNN网络中最主要的特征提取层,其目的为通过采用卷积核的方式对图像进行卷积操作,通过不断的提取图像中的feature maps ,对图像中各个像素点或相邻位置的像素关系进行提取,最终完成图像的分类、目标识别等操作。
卷积操作的特点
1)减少参数的计算量
2)特征提取的过程中可以关注周围图像的特征
# 操作代码
import torch.nn as nn
conv = nn.Conv2d(
in_channels=4, # 输入通道的大小
out_channels=1, # 输出通道的大小
kernel_size=3, # 卷积核大小
stride=1, # 步长
padding=1, # 周围填充
groups=1, # 分组 = 主要用于多通道卷积,group 与 group 之间参数不共享
dilation = 1) # 膨胀系数 == 用于膨胀卷积操作
三、池化层
池化层主要的目的为对特征图进行Maxpooling,在最大限度保持图像特征的基础上,降低特征图的大小,降低参数的计算量,提高计算效率。
最常用的池化操作为 最大池化 与 平均池化 两种。
# 代码演示
# 最大池化
nn.MaxPool2d(
kernel_size=2, # 卷积核大小
stride=2, # 步长
padding=0, # 周围填充
dilation=1, # 膨胀系数
return_indices=False, # 是否返回index == 用于 上采样操作
)
nn.AvgPool2d(
kernel_size=2, # 卷积核大小
stride=2, # 步长
padding=0,
ceil_mode=False
)
# 当卷积核为2*2 步长为2时,输入图像为512*512==>输出图像尺寸为256*256。同时 Maxpooling中不增加参数量,不改变特征图输入通道数与输出通道数。
三、全连接层
全连接操作主要为将提取到的特征同经过flatten后进行全连接操作,最终采用softmax函数输出,进行图像的多分类操作。
# 代码演示 == 线性层
nn.Linear(
in_features=64, # 输入的特征数量
out_features=10, # 输出特征数量
bias=True, # 偏置
)
四、小结
以上是构成CNN网络模型的三大模块,最终的成品进行展示如下。
# 继承nn.Module类,进行模型构建
class MyNET(nn.Module):
def __init__(self):
super(MyNET,self).__init__()
self.conv1 = nn.Conv2d(
in_channels=1,
out_channels=6,
kernel_size=5,
stride=1,
padding=0,
)
self.conv3 = nn.Conv2d(
in_channels=6,
out_channels=16,
kernel_size=5,
stride=1,
padding=0,
)
self.Linear5 = nn.Linear(in_features= 16 * 5 * 5,
out_features=120)
self.Linear6 = nn.Linear(in_features=120,
out_features=84)
self.Linear7 = nn.Linear(in_features=84,
out_features=10)
def sortmax(self,x):
model = nn.Softmax(dim=1)
return model(x)
def forward(self,x):
x = self.conv1(x) # 第一次卷积
x = self.maxpooling(x) # 第一次池化
x = self.conv3(x) # 第二次卷积
x = self.maxpooling(x) # 第二次池化 16*5*5
# 对数据进行展平
x = x.view(-1,16*5*5) # 确定输出值 自动计算输入的行数
x = self.Linear5(x)
x = self.Linear6(x)
x = self.Linear7(x)
x = self.sortmax(x)
return x
def maxpooling(self,x):
max_pool = nn.MaxPool2d(kernel_size=2,stride=2)
return max_pool(x)