动手学深度学习Pytorch(三)——卷积神经网络

文章目录

1. 参考资料

[1] 动手学深度学习 v2 - 从零开始介绍深度学习算法和代码实现
课程主页:https://courses.d2l.ai/zh-v2/
教材:https://zh-v2.d2l.ai/
[2] 李沐老师B站视频:https://www.bilibili.com/video/BV1MB4y1F7of?p=3

2. 图像卷积

2.1 互相关运算(cross-correlation)

在卷积层中,输入张量和核张量通过互相关运算产生输出张量。
动手学深度学习Pytorch(三)——卷积神经网络
计算: 卷积窗口从输入张量的左上角开始,从左到右从上到下滑动。当卷积窗口滑动到新一个位置时,包含在该窗口的部分张量与卷积张量按元素相乘,得到的值求和得到单一标量值。
Y ( i , j ) = ( X ( i : i + h , y : y + w ) ∗ K ) . s u m ( ) Y(i,j)=(X(i:i+h,y:y+w)*K).sum() Y(i,j)=(X(i:i+h,y:y+w)∗K).sum()

作用
卷积层可以通过重复使用卷积核有效地表征局部空间

2.2 学习卷积核

对于连续的卷积层而言,我们不可能手动设计卷积核。我们需要学习有X生成Y的卷积核。
思想
在每次迭代中,比较Y与卷积层输出的平方误差,然后计算梯度更新卷积核。

# 构造一个二维卷积层,它具有1个输出通道和形状为(1,2)的卷积核
conv2d = nn.Conv2d(1,1, kernel_size=(1, 2), bias=False)
# 循环迭代开始
Y_hat = conv2d(X)		# X输入的卷积层输出
l = (Y_hat - Y) ** 2	# 平方误差
conv2d.zero_grad()		# 梯度清零
l.sum().backward()		# 反向传播-自动求导
# 更新卷积核
conv2d.weight.data[:] -= lr * conv2d.weight.grad
# 循环迭代结束

2.3 特征图和感受野

特征图(feature map)
卷积层的输出可以看作输入在空间维度上的表征,称为特征图

感受野(receptive field)
在卷积神经网络中,对于某一层的任意元素,其感受野是指前向计算的所有可能输入区域。
动手学深度学习Pytorch(三)——卷积神经网络
其中,输出层中19的感受野是输入层中的阴影部分。对输出层与2*2的核函数再做互相干运算,输出单个元素z。z的感受野就是输入层的9个元素。更深的卷积神经网络使特征图中单个元素的感受野更加宽阔。

3. 填充和步幅(padding and stride)

一般来说,假设输入形状 n h × n w n_h \times n_w nh​×nw​,卷积核窗口形状 k h × k w k_h \times k_w kh​×kw​,输出形状为:
( n h − k h + 1 ) × ( n w − k w + 1 ) (n_h-k_h+1) \times (n_w-k_w+1) (nh​−kh​+1)×(nw​−kw​+1)

卷积层输出的形状由输入和核窗口形状决定。

  • 情况1:连续的卷积之后,得到的输出大小可能太小了,从而丢失了很多原始图像边界上的有用信息。
  • 情况2:希望大幅度降低图像大小,则需要采用很多卷积层才能实现。

3.1 填充(padding)

目的
防止在连续卷积后,输出太小而导致的有用信息丢失。

定义
在输入的高和宽两侧填充元素(0)。当设置填充 p a d d i n g = n padding = n padding=n时,两侧一共填充 2 n 2n 2n行(列)。
动手学深度学习Pytorch(三)——卷积神经网络
输出形状

  • 假设高的两侧一共填充 p h p_h ph​行,宽两侧一共填充 p w p_w pw​行,则输出形状为:

( n h − k h + 1 + p h ) × ( n w − k w + 1 + p w ) (n_h-k_h+1+p_h) \times (n_w-k_w+1+p_w) (nh​−kh​+1+ph​)×(nw​−kw​+1+pw​)

  • 一般设置 p h = k h − 1 , p w = k w − 1 p_h=k_h-1,p_w=k_w-1 ph​=kh​−1,pw​=kw​−1使输入和输出具有相同的高和宽。

参数
p a d d i n g = ( h , w ) padding=(h,w) padding=(h,w):表示总共添加2h行2w列
p a d d i n g = x padding=x padding=x:表示总共添加2x行2x列

import torch
from torch import nn

conv2d = nn.Conv2d(1, 1, kernel_size = 3, padding = 1)	# 总共添加2行2列

3.2 步幅(stride)

目的
大幅度降低输入大小、高效计算或缩减采样次数

定义
每次滑动元素的数量
动手学深度学习Pytorch(三)——卷积神经网络
输出形状

  • 假设垂直步幅为 s h s_h sh​,水平步幅为 s w s_w sw​,则输出大小为:

( n h − k h + p h + s h ) / s h × ( n w − k w + p w + s w ) / s w (n_h-k_h+p_h+s_h)/s_h \times (n_w-k_w+p_w+s_w)/s_w (nh​−kh​+ph​+sh​)/sh​×(nw​−kw​+pw​+sw​)/sw​

  • 一般将高度和宽度步幅设置为2,从而将输入的高度和宽度减半:
    n h / 2 × n w / 2 n_h/2 \times n_w/2 nh​/2×nw​/2

参数
s t r i d e = ( s h , s w ) stride=(s_h,s_w) stride=(sh​,sw​):高度和宽度的步幅分别为 s h , s w s_h,s_w sh​,sw​
s t r i d e = s stride=s stride=s:高度和宽度的步幅均为s

conv2d = nn.Conv2d(1, 1, kernel_size=(3, 5), padding=(0, 1), stride=(3, 4))

当输入为8*8时,垂直填充0行,水平填充2列,高度步幅为3,宽度步幅为4,输出大小为:
( 8 − 3 + 1 + 0 + 3 ) / 3 × ( 8 − 5 + 1 + 2 + 4 ) / 4 = 2 × 2 (8-3+1+0+3)/3 \times (8-5+1+2+4)/4=2 \times 2 (8−3+1+0+3)/3×(8−5+1+2+4)/4=2×2

4. 多输入多输出通道

目的

  • 每个输出通道可以识别特定模式
    动手学深度学习Pytorch(三)——卷积神经网络
  • 输入通道核识别并组合输入中的模式。

4.1 多输入通道

假设输入的通道数为 c i c_i ci​,那么卷积核的输入通道数也需要为 c i c_i ci​
多通道输入和多通道卷积核之间的二维互相关运算
对每个通道输入的二维张量和卷积核的二维张量进行互相关运算,再对通道求和得到二维张量。
动手学深度学习Pytorch(三)——卷积神经网络

  • 输入 X X X: c i × n h × n w c_i \times n_h \times n_w ci​×nh​×nw​
  • 卷积核 W W W: c i × k h × k w c_i \times k_h \times k_w ci​×kh​×kw​
  • 输出 Y Y Y: m h × m w m_h \times m_w mh​×mw​
  • (多通道卷积求和得到单输出通道)
    Y = ∑ i = 0 c i X i , : , : ∗ W i , : , : Y = \sum_{i=0}^{c_i} X_{i,:,:}* W_{i,:,:} Y=i=0∑ci​​Xi,:,:​∗Wi,:,:​

4.2 多输出通道

  • 输入 X X X: c i × n h × n w c_i \times n_h \times n_w ci​×nh​×nw​
  • 卷积核 W W W: c o × c i × k h × k w c_o \times c_i \times k_h \times k_w co​×ci​×kh​×kw​
  • 输出 Y Y Y: c o × m h × m w c_o \times m_h \times m_w co​×mh​×mw​
  • 可以有多个三维卷积核,每个核生成一个输出通道。
    Y i , : , : = ∑ i = 0 c i X ∗ W i , : , : , : Y_{i,:,:} = \sum_{i=0}^{c_i} X* W_{i,:,:,:} Yi,:,:​=i=0∑ci​​X∗Wi,:,:,:​

4.3 1 × 1 1 \times 1 1×1卷积层

  • k h = k w = 1 k_h=k_w=1 kh​=kw​=1的卷积核。输入形状 n h n w × c i n_h n_w \times c_i nh​nw​×ci​,卷积层的权重维度为 c i × c o c_i \times c_o ci​×co​,输出形状为 n h × n w × c o n_h \times n_w \times c_o nh​×nw​×co​
    动手学深度学习Pytorch(三)——卷积神经网络
  • 1 × 1 1 \times 1 1×1卷积层不识别空间模式,只是融合通道。
    理解:通过 1 × 1 1 \times 1 1×1卷积层能将输入通道数为 c i c_i ci​的输入层转化为通道数为 c o c_o co​的输出层。

4.4 二维卷积层

  • 输入 X X X: c i × n h × n w c_i \times n_h \times n_w ci​×nh​×nw​
  • 卷积核 W W W: c o × c i × k h × k w c_o \times c_i \times k_h \times k_w co​×ci​×kh​×kw​
  • 偏差 B B B: c o × c i c_o \times c_i co​×ci​
  • 输出 Y Y Y: c o × m h × m w c_o \times m_h \times m_w co​×mh​×mw​
  • Y = X ∗ W + B Y = X*W+B Y=X∗W+B
  • 时间复杂度: O ( c i c o k h k w m h m w ) O(c_ic_ok_hk_wm_hm_w) O(ci​co​kh​kw​mh​mw​)

5. 池化层

池化层通常作用于卷积层之后。
目的

  • 缓解卷积层对位置的敏感性(卷积对位置敏感)
  • 降低对空间降采样表示的敏感度(需要一定程度的平移不变性)

5.1 最大池化层和平均池化层

池化层由一个固定形状的窗口组成,该窗口根据其步幅大小在输入的所有区域上滑动,为池化窗口遍历的每个位置计算一个输出。
(1)最大池化层
返回滑动窗口中的最大值。
动手学深度学习Pytorch(三)——卷积神经网络
作用

  1. 允许输入发生小小的偏移,
  2. 检测窗口中最强的模式信号

(2)平均池化层
返回滑动窗口中的平均值。
作用

  1. 柔和化

5.2 超参数

  • 相同: 池化层与卷积层类似,都具有填充和步幅。
  • 填充padding
  • 步幅stride
  • 区别: 在每个输入通道应用池化层以获得相应的输出通道,输出通道数 = 输入通道。

6. 卷积层的超参数

  1. 填充 p a d d i n g = ( p h , p w ) padding=(p_h,p_w) padding=(ph​,pw​)
  2. 步幅 s t r i d e = ( s h , s w ) stride=(s_h,s_w) stride=(sh​,sw​)
  3. 输出通道 c o c_o co​
上一篇:数据库高级查询(员工部门表)示例1


下一篇:Windows 安装配置memcached+php的教程,以及相关资源下载