卷积神经网络是一种深度前馈神经网络。
- 物体定位:预测包含主要物体的图像区域,以便识别区域中的物体。
- 物体识别:针对分割号的目标进行分类。
- 目标检测:将图像目标分割出来,针对图像上的像素进行归属。
- 关键点检测:从图像中检测目标物体上某个关键点的位置。
全连接层
包含W和激活函数。
全连接层的内容
全连接示意图
补充说明:
- 当完成激活(activation)后的结果为一维向量时,结果称为特征向量(激活向量)。
- 激活后的结果为二维向量时,称为特征层(feature map。有时也称为激活层 activation map)。
卷积层:一种局部操作,通过一定大小的卷积核作用于局部图像区域,从而看到图像的局部信息
保留输入图像的空间特征,对一张图片32*32*3而言,卷积层的输入就是32*32*3的矩阵。
- 卷积核kernel:简称卷积、滤波器filter。卷积核的大小可以在实际需要时自定义其长和宽 (1*1、3*3、5*5),其通道个数一般设置为与输入图片通道数量一致。
- 步长(stride):指卷积在输入图片上移动时需要移动的像素数。步长=1,移动一个像素。
卷积每次滑动覆盖的格子范围在图像处理中被称为“感受野”。
- 步长=1,输出的特征层大小为5*5;
- 步长=2,输出特征层大小为3*3;
通用的卷积形式
输入图像为(宽、高、channel)。kernel大小为F*F,步长为S,pad大小为P,kernel个数为K。
eg: 输入为32*32*3,kernel个数为10,大小为5*5,步长为1,pad=2;
根据公式
则输出的特征层大小为32*32*10,每个kernel对应的参数个数5*5*3+1=76(+1表示bias),因此卷积的参数个数为76*10=760。
代码:
classtorch.nn.Conv2d(in_channel,out_channels,kernel_size,stride=1,padding=0,dilation=1,groups=1,bias=True):
in_channels(int) #输入图片的channel
out_channels(int) #输出(特征层)图片的channel
kernel_size( int or tuple) #kernal的大小
stride( int or tuple,optional) #卷积的步长,默认为1
padding (int or tuple,optional) #四周pad的大小,默认为0
dilation(int or tuple,optional) #kernel元素间的距离,默认为1
groups(int,optional)#将原始输入channel划分成组数,默认为1
bias (bool,optinal) #如果是True,则输出的bias可学,默认为True
池化层
池化(pooling)对图像进行压缩的一种方法,max pooling、average pooling等。
假设图像输入,池化参数重,池化kernel的大小为F*F。步长为S,经过池化后:
F=2,S=2,一个4*4的特征层经过池化filter=2*2,stride=2的最大赤化操作后可以得到一个2*2的特征层。
池化层对原始特征层的信息进行压缩,是卷积神经网络中很重要的一步。绝大多数情况下,卷积层、池化层、激活层为一个整体出现。
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __int__(self):# 定义卷积神经网络需要的元素
super(Net,self).__init__()
self.conv1 =nn.Conv2d(3,6,5) #定义第一个卷积层
self.pool = nn.MaxPool2d(2,2)#池化层
self.conv2= nn.Conv2d(6,16,5) #定义第二个卷积层
self.fc1 = nn.Linear(16*5*5,120) #全连接层
self.fc2 = nn.Linear(120,84) #全连接层
self.fc3 = nn.Linear(84,10) #最后一个链接层用作10分类
def forward(self,x): #使用__init__()中的定义,构建卷积神经网络结构
x = self.pool(F.relu(self.conv1(x))) # 第一个卷积层首先经过ReLU做激活,然后使用前面定义的nn.MaxPool2d(2,2)方法做池化
x = self.pool(F.relu(self.conv2(x))) #第二个卷积层也要经过ReLU做激活,然后使用前面定义的nn.MaxPool2d(2,2)方法做池化
x = x.view(-1,16*5*5) #对特征层是Tensor维度进行变换
x = F.view(self.fc1(x)) #卷积神经网络的特征层经过第一次全连接层操作,然后在通过ReLU层激活
x = F.relu(self.fc2(x)) #卷积神经网络的特征层经过第二次全连接层操作,然后在通过ReLU层激活
x = self.fc3(x) #卷积神经网络的特征层经过最后一次全连接层操作,得到最终要分类的结构(10分类标签)
return x
net=Net()