【动手学习深度学习】7 卷积神经网络基础

目录

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问题:当图片像素很大时,网络的每次输入维度会很高,需要极好的硬件才能处理,并且需要消耗大量时间。

7.1. 卷积

一个系统,输入不稳定,输出稳定,可以用卷积求系统存量。

eg:食物与消化:在t时刻胃中食物量的多少。输入是某时刻吃的食物,输出是胃消化食物的快慢(速率)。在一个特定时刻

【动手学习深度学习】7 卷积神经网络基础_第1张图片 输入 【动手学习深度学习】7 卷积神经网络基础_第2张图片 输出

考虑t某时刻胃中的食物。在x时刻摄入食物为f(x),到t时刻消化了g(t-x),胃中还剩f(x).g(t-x)。由于计算的是0-t时间内还剩的食物,将0-t时间内所有剩余食物加起来,自然就是结果。

【动手学习深度学习】7 卷积神经网络基础_第3张图片

卷积公式: 

【动手学习深度学习】7 卷积神经网络基础_第4张图片 卷积用图像表示 【动手学习深度学习】7 卷积神经网络基础_第5张图片 g(t)翻转

7.2. 图像卷积

eg:蝴蝶与飓风

(1) 飓风在某时刻t发生了,在t时刻之前,有很多蝴蝶煽动翅膀,它们煽动翅膀这件事情,会对飓风的发生产生影响。蝴蝶煽动翅膀的影响看作f,这个影响是会随着时间的变化而变化的,使用g函数来描述影响的衰减。那么此时卷积处理的就是在飓风发生的时候,蝴蝶煽动翅膀这件事对飓风发生产生的影响。

(2) x时刻发生了一件事会对t时刻产生影响,具体的影响会随着t-x这段时间进行变化,g函数规定了这段时间的变化:之前发生的一些事情,随着时间影响力的变化。

(3) 对于图像的卷积来说,可以得到很多像素点怎么对一个像素点产生影响的卷积核就是规定了周围一圈(3*3)(两圈就是5*5)的像素点是如何对当前的像素点产生影响的。

【动手学习深度学习】7 卷积神经网络基础_第6张图片【动手学习深度学习】7 卷积神经网络基础_第7张图片

【动手学习深度学习】7 卷积神经网络基础_第8张图片 g和w都指一个东西,两种理解方式 【动手学习深度学习】7 卷积神经网络基础_第9张图片

适用于计算机视觉的神经网络架构:1、平移不变性;2、局部性

(1) 利用图像卷积提取局部特征

(2) 过滤器:像素点通过卷积核对其周围像素点进行试探,如果不想考虑进去的因素,就把对应因素的值设为0,保留了周围有用的特征。

(3) 像素点通过卷积核,可以将它周围有用的(指定的)特征保留下来。那么卷积的结果其实就是局部特征匹配的情况!!!!就可以得到特征信息啦,利用这些特征信息就可以进行图像识别。

上述部分来自从“卷积”、到“图像卷积操作”、再到“卷积神经网络”,“卷积”意义的3次改变_哔哩哔哩_bilibili

7.3. 填充与步幅

填充和步幅可用于有效地调整数据的维度

7.3.1. 填充

原因:丢失边缘像素

具体过程:在输入图像的边界填充元素(通常填充元素是0)来增加输出的高度和宽度。这常用来使输出与输入具有相同的高和宽。

【动手学习深度学习】7 卷积神经网络基础_第10张图片【动手学习深度学习】7 卷积神经网络基础_第11张图片

7.3.2. 步幅 

为了高效计算或是缩减采样次数,卷积窗口可以跳过中间位置,每次滑动多个元素。

【动手学习深度学习】7 卷积神经网络基础_第12张图片

7.3.3. 代码

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

【动手学习深度学习】7 卷积神经网络基础_第13张图片

7.4. 多输入多输出通道

7.4.1. 多输入通道

eg:RGB的图片就是多通道输入

【动手学习深度学习】7 卷积神经网络基础_第14张图片【动手学习深度学习】7 卷积神经网络基础_第15张图片

 输出是单通道

优点:输入通道核识别并组合输入中的模式

7.4.2.  多输出通道

原理:多个三维卷积核,每个核生成一个输出通道

【动手学习深度学习】7 卷积神经网络基础_第16张图片

 优点:每个输出通道可以识别特定模式

7.4.3. 1×1 卷积层

作用:融合通道

  • 当以每像素为基础应用时,1×1卷积层相当于全连接层。

  • 1×1卷积层通常用于调整网络层的通道数量和控制模型复杂性

【动手学习深度学习】7 卷积神经网络基础_第17张图片

7.4.4. 二维卷积层

【动手学习深度学习】7 卷积神经网络基础_第18张图片

总结: 

  • 输出通道数是卷积层的超参数
  • 每个输入通道有独立的二维卷积核,所有通道结果相加得到一个输出通道结果
  • 每个输出通道有独立的三维卷积核

7.4.5. 代码

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为输出通道

7.5. 池化层

  • 池化层返回窗口中最大或平均值
  • 缓解卷积层会位置的敏感性
  • 同样有窗口大小、填充、和步幅作为超参数

7.5.1. 二维最大池化

返回滑动窗口中的最大值

【动手学习深度学习】7 卷积神经网络基础_第19张图片

通过该操作,可以容忍1像素移位 

7.5.2. 池化层的填充、步幅和多通道

  • 池化层与卷积层类似,都具有填充和步幅
  • 没有可学习的参数
  • 在每个输入通道应用池化层以获得相应的输出通道
  • 输出通道数=输入通道数

7.5.3. 平均池化层

最大池化层:每个窗口中最强的模式信号

平均池化层:将最大池化层中的“最大”操作替换为“平均”

7.5.4. 代码

【动手学习深度学习】7 卷积神经网络基础_第20张图片

 

nn.Conv2d()

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)

参数解释:

【动手学习深度学习】7 卷积神经网络基础_第21张图片

具体查看:Pytorch中nn.Conv2d的参数用法 channel含义详解 

nn.MaxPool2d()

class torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, 
dilation=1, return_indices=False, ceil_mode=False)

参数:

【动手学习深度学习】7 卷积神经网络基础_第22张图片   

你可能感兴趣的:(知识学习,深度学习,cnn)