目录
7.1. 卷积
7.2. 图像卷积
7.3. 填充与步幅
7.3.1. 填充
7.3.2. 步幅
7.3.3. 代码
7.4. 多输入多输出通道
7.4.1. 多输入通道
7.4.2. 多输出通道
7.4.3. 1×1 卷积层
7.4.4. 二维卷积层
7.4.5. 代码
7.5. 池化层
7.5.1. 二维最大池化
7.5.2. 池化层的填充、步幅和多通道
7.5.3. 平均池化层
7.5.4. 代码
nn.Conv2d()
nn.MaxPool2d()
引入CNN原因:
MLP问题:当图片像素很大时,网络的每次输入维度会很高,需要极好的硬件才能处理,并且需要消耗大量时间。
一个系统,输入不稳定,输出稳定,可以用卷积求系统存量。
eg:食物与消化:在t时刻胃中食物量的多少。输入是某时刻吃的食物,输出是胃消化食物的快慢(速率)。在一个特定时刻
考虑t某时刻胃中的食物。在x时刻摄入食物为f(x),到t时刻消化了g(t-x),胃中还剩f(x).g(t-x)。由于计算的是0-t时间内还剩的食物,将0-t时间内所有剩余食物加起来,自然就是结果。
eg:蝴蝶与飓风
(1) 飓风在某时刻t发生了,在t时刻之前,有很多蝴蝶煽动翅膀,它们煽动翅膀这件事情,会对飓风的发生产生影响。蝴蝶煽动翅膀的影响看作f,这个影响是会随着时间的变化而变化的,使用g函数来描述影响的衰减。那么此时卷积处理的就是在飓风发生的时候,蝴蝶煽动翅膀这件事对飓风发生产生的影响。
(2) x时刻发生了一件事会对t时刻产生影响,具体的影响会随着t-x这段时间进行变化,g函数规定了这段时间的变化:之前发生的一些事情,随着时间影响力的变化。
(3) 对于图像的卷积来说,可以得到很多像素点怎么对一个像素点产生影响的。卷积核就是规定了周围一圈(3*3)(两圈就是5*5)的像素点是如何对当前的像素点产生影响的。
适用于计算机视觉的神经网络架构:1、平移不变性;2、局部性
(1) 利用图像卷积提取局部特征。
(2) 过滤器:像素点通过卷积核对其周围像素点进行试探,如果不想考虑进去的因素,就把对应因素的值设为0,保留了周围有用的特征。
(3) 像素点通过卷积核,可以将它周围有用的(指定的)特征保留下来。那么卷积的结果其实就是局部特征匹配的情况!!!!就可以得到特征信息啦,利用这些特征信息就可以进行图像识别。
上述部分来自从“卷积”、到“图像卷积操作”、再到“卷积神经网络”,“卷积”意义的3次改变_哔哩哔哩_bilibili
填充和步幅可用于有效地调整数据的维度
原因:丢失边缘像素
具体过程:在输入图像的边界填充元素(通常填充元素是0)来增加输出的高度和宽度。这常用来使输出与输入具有相同的高和宽。
为了高效计算或是缩减采样次数,卷积窗口可以跳过中间位置,每次滑动多个元素。
import torch
from torch import nn
##一般的例子
nn.Conv2d(1, 1, kernel_size=3, padding=1, stride=2)
#kernel_size指卷积核的形状
#padding指填充 stride指步幅
#高度和宽度两边的填充为1
#步幅为2
##复杂的例子
nn.Conv2d(1, 1, kernel_size=(3, 5), padding=(0, 1), stride=(3, 4))
#高度和宽度两边的填充分别为0和1
#垂直步幅为3,水平步幅为4
eg:RGB的图片就是多通道输入
输出是单通道
优点:输入通道核识别并组合输入中的模式
原理:多个三维卷积核,每个核生成一个输出通道
优点:每个输出通道可以识别特定模式
作用:融合通道
当以每像素为基础应用时,1×1卷积层相当于全连接层。
1×1卷积层通常用于调整网络层的通道数量和控制模型复杂性
总结:
1、手写
import torch
from d2l import torch as d2l
#多输入
def corr2d_multi_in(X, K):
# 先遍历“X”和“K”的第0个维度(通道维度),再把它们加在一起
return sum(d2l.corr2d(x, k) for x, k in zip(X, K))
#多输出
def corr2d_multi_in_out(X, K):
# 迭代“K”的第0个维度,每次都对输入“X”执行互相关运算。
# 最后将所有结果都叠加在一起
return torch.stack([corr2d_multi_in(X, k) for k in K], 0)
2、pytorch调用
import torch
from torch import nn
##一般的例子
nn.Conv2d(1, 1, kernel_size=3, padding=1, stride=2)
#第一个1为输入通道,第二个1为输出通道
返回滑动窗口中的最大值
通过该操作,可以容忍1像素移位
最大池化层:每个窗口中最强的模式信号
平均池化层:将最大池化层中的“最大”操作替换为“平均”
nn.Conv2d是二维卷积方法,相对应的还有一维卷积方法nn.Conv1d,常用于文本数据的处理,而nn.Conv2d一般用于二维图像。
先看一下接口定义:
class torch.nn.Conv2d(in_channels,
out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1,
bias=True)
参数解释:
具体查看:Pytorch中nn.Conv2d的参数用法 channel含义详解
class torch.nn.MaxPool2d(kernel_size, stride=None, padding=0,
dilation=1, return_indices=False, ceil_mode=False)
参数: