目录
CNN = 卷积神经网络(Convolutional Neural Network)
一、图象基础知识
1、图像的构成
由像素点构成
2、图像的分类
- 灰度图像(单通道)
- 只有 1 个通道
- 每个像素:0~255
- 0 = 纯黑
- 255 = 纯白
- 形状:H,W 高 × 宽
- 彩色图像(RGB 三通道)
- R 红、G 绿、B 蓝 3 个通道
- 每个通道像素值:0~255
- 形状:H,W,C 高 × 宽 × 通道数
3、拓展知识
- PyTorch 格式:B,C,H,W 批次、通道、高、宽
- 黑白图不是只有黑色白色,是深浅灰色组成
- 彩色图 = 三张灰度图叠加(R/G/B 各一张)
总结速记版:
图片由像素组成,灰度单通道,RGB 三通道,数值 0 到 255,矩阵存储。
4、图像的加载方法
plt.imread()
plt.imshow()
二、卷积神经网络概述
1、什么是卷积神经网络?
**卷积神经网络(Convolutional Neural Network)**是含有卷积层的神经网络. 卷积层的作用就是用来自动学习、提取图像的特征。
2、卷积神经网络的组成
CNN网络主要由三部分构成:卷积层、池化层和全连接层构成:
卷积层负责提取图像中的局部特征;
池化层用来大幅降低参数量级(降维);
全连接层用来输出想要的结果。
3、CNN概述
CNN要做的事情是:
给定一张图片,是车还是马未知,是什么车也未知,现在需要模型判断这张图片里具体是一个什么东西,总之输出一个结果:如果是车 那是什么车
最左边是 数据输入层:对数据做一些处理,比如去均值(各维度都减对应维度的均值,使得输入数据各个维度都中心化为0,避免数据过多偏差,影响训练效果)、归一化(把所有的数据都归一到同样的范围)、PCA等等。CNN只对训练集做"去均值"这一步。
中间是 卷积层(CONV):线性乘积求和,提取图像中的局部特征
激励层(RELU):ReLU激活函数,输入数据转换成输出数据
池化层(POOL):取区域平均值或最大值,大幅降低参数量级(降维) 最右边是
全连接层(FC):输出CNN模型预测结果
功能总结:
卷积层:特征提取
池化层:降维
全连接层:得到输出结果
三、卷积层
1、卷积计算

输入通过滤波器得到输出:
计算一下参数用二维表示:

11=4 = 1*1 +1*0 +1*1 + 0*0+1*1 +1+0 +0*1 +0*0 +1+1=4

22=4= 1*1 + 1*0 + 1+1 +0*1 +1*1 +1*0 + 0*1 + 1*0 +1*1 =4
可以根据示意图计算一下其他位置的数据验证。
2、padding(填充)
padding(填充)操作用于处理卷积时图像边缘的像素。 其目的是在输入图像的边界周围添加额外的像素(通常是零),从而解决卷积操作时边缘信息丢失的问题。
3、stride(步长)
stride(步长)指的是卷积核在图像上滑动时的步伐大小,即每次卷积时卷积核在图像中向右(或向下)移动的像素数。步长直接影响卷积操作后输出特征图的尺寸,以及计算量和模型的特征提取能力。
4、多通道卷积计算

5、多卷积核计算


6、特征图大小
输出特征图的大小与以下参数息息相关:
size: 卷积核/过滤器大小,一般会选择为奇数,比如有 1*1 、3*3、5*5
Padding: 零填充的方式
Stride: 步长
那计算方法如下图所示:
输入图像大小: W x W
卷积核大小: F x F
Stride: S
Padding:
P 输出图像大小: N x N
计算公式:

计算示例:
以下图为例:
图像大小: 5 x 5
卷积核大小: 3 x 3
Stride: 1
Padding: 1
(5 - 3 + 2) / 1 + 1 = 5, 即得到的特征图大小为: 5 x 5

7、卷积层API
python
conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)
"""
参数说明:
in_channels: 输入通道数,
out_channels: 输出通道,也可以理解为卷积核kernel的数量
kernel_size:卷积核的高和宽设置,一般为3,5,7...
stride:卷积核移动的步长
padding:在四周加入padding的数量,默认补0
"""
四、池化层
1、池化层的作用
池化层 (Pooling) 降低维度, 从而减少计算量、减少内存消耗,并提高模型的鲁棒性。
2、池化分类
(1) 最大池化
(2)平均池化

3、池化层API
python
# 最大池化
nn.MaxPool2d(kernel_size=2, stride=2, padding=1)
# 平均池化
nn.AvgPool2d(kernel_size=2, stride=1, padding=0)