什么是卷积?
1.卷积的由来
卷积神经网络的发展由来:
传统的模式识别模型:特征提取器从图像中提取相关特征,再通过分类器对这些特征进行分类。
使用梯度下降法的前馈全连接网络可以从大量的数据中学习复杂且高维非线性的特征映射,因此传统的前馈全连接网络(BP神经网络)被广泛用于图像识别任务。虽然可以直接将图像的像素特征(向量)作为输入信号输入网络,但是基于全连接神经网络的识别还存在一些问题。
问题:
首先,隐藏层神经元数量越多的全连接网络包含的连接权值就越多,这极大地增加了内存参数,并且需要更大的训练集来确定连接权值。
其次,对于图像或者音频而言,它们不具备平移、旋转、拉伸的不变形,输入神经网络前必须进行预处理。对于这些可能出现的问题,往往需要更多的神经元来增强网络的稳健性。
最后,全连接层忽略了输入的拓扑结构。在一幅图像中,相邻的像素相关性较高的区域可以归为一个区域,像素之间相关性较低的区域则视为不同的区域,利用这个特性进行局部特征的提取有巨大的优势。
如何充分利用这些局部信息?
20世纪60年代,Hubel和Wiesel在研究猫脑皮层中负责处理局部敏感和方向选择的神经元时,发现了一种特别的网络结构,能明显的降低反馈神经网络的复杂性,随机提出了卷积神经网络(Convolutional Neural Networks,CNN)的概念。
目前,CNN已经成为众多科学领域的研究热点之一,该网络不需要对图像进行复杂的预处理,可以直接输入原始图像,因此在计算机视觉方面得到了广泛的应用。
2.卷积的概念
卷积在数学意义上就是内积,根据多个确定的权重(卷积核),对某一范围内的像素进行内积运算,输出就是提取的特征。
在传统的BP神经网络中,前后层之间的神经元是“全连接”的,即每个神经元都与前一层的所有神经元相连。
而卷积中的神经元只与前一层的部分神经元相连。
从仿生的角度来说,CNN在处理图像矩阵问题时会更加高效。
(eg:人的单个视觉神经元并不需要对全部图像进行感知,而只需要对局部信息进行感知即可,距离较远、相关性比较弱的元素不在计算范围内)
从计算角度说,卷积是的参数量与计算量大幅度降低。
个人总结:
传统的BP神经网络,前后层所有神经元连接,计算量参数量很大。
卷积神经网络,前后层部分神经元连接,计算量参数量大幅度降低。
当前在以卷积神经网络为代表的模型中,绝大部分参数都集中在卷积核内,而卷积核组类似于传统图像处理中的滤波器,不同的卷积核代表不同的滤波模式,单一的卷积核及多个卷积核的组合,实现的就是特征提取的功能,它可以反映模型学习到了什么样的特征,是对模型最本质的解释。
网络浅层/底层 深层 越深层 学习到的特征 边缘 目标形状 语义级别的目标 感受野 越小,看到的就是越局部的信息 越大,看到的就是越全局的信息,学习到的知识越抽象
# 模型结构的定义
# 这是一个简单的图像分类模型
# 下面我们首先来定义一个包含3个卷积层、3个BN层和3个全连接层的模型,完整代码如下:
import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np
# 3层卷积神经网络Simpleconv3定义
# 包括3个卷积层、3个BN层、3个ReLU激活层和3个全连接层
class Simpleconv3(nn.Module):
# 初始化函数
def _init_(self,nclass):
super(simpleconv3,self)._init_()
# 输入图片大小为3×48×48,输出特征图大小为12×23×23,卷积核大小为3×3,步长为2
self.conv1=nn.Conv2d(3,12,3,2)
# 输入图片大小为12×23×23,输出特征图大小为24×11×11,卷积核大小为3×3,步长为2
self.bn1=nn.BatchNorm2d(12)
self.conv2=nn.Conv2d(12,24,3,2)
# 输入图片大小为24×11×11,输出特征图大小为48×5×5,卷积核大小为3×3,步长为2
self.bn2=nn.BatchNorm2d(24)
self.conv3=nn.Conv2d(24,48,3,2)
# 输入向量长为48×5×5=1200,输出向量长为1200
self.bn3=nn.BatchNorm2d(48)
self.fc1=nn.Linear(48*5*5,1200)
# 输入向量长为1200,输出向量长为128
self.fc2=nn.Linear(1200,128)
# 输入向量长为128,输出向量长为nclass,等于类别数
self.fc3=nn.Linear(128,nclass)
# 前向函数
def forward(self,x):
# relu函数,不需要进行实例化,可以直接调用
# conv 和fc 层需要调用nn.Module进行实例化
x =F.relu(self.bn1(self.conv1(x)))
x =F.relu(self.bn2(self.conv2(x)))
x =F.relu(self.bn3(self.conv3(x)))
x =x.view(-1,48*5*5)
x =F.relu(self.fc1(x))
x =F.relu(self.fc2(x))
x =self.fc3(x)
return x
参考文献:
1.《深度学习之图像识别 核心算法与实战案例 (全彩版)》言有三 著
出版社:清华大学出版社 ,出版时间:2023年7月第一版(第一次印刷)
ISBN:978-7-302-63527-7