[1] 动手学深度学习 v2 - 从零开始介绍深度学习算法和代码实现
课程主页:https://courses.d2l.ai/zh-v2/
教材:https://zh-v2.d2l.ai/
[2] 李沐老师B站视频:https://www.bilibili.com/video/BV1MB4y1F7of?p=3
在卷积层中,输入张量和核张量通过互相关运算产生输出张量。
计算: 卷积窗口从输入张量的左上角开始,从左到右从上到下滑动。当卷积窗口滑动到新一个位置时,包含在该窗口的部分张量与卷积张量按元素相乘,得到的值求和得到单一标量值。
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()
作用
卷积层可以通过重复使用卷积核有效地表征局部空间
对于连续的卷积层而言,我们不可能手动设计卷积核。我们需要学习有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
# 循环迭代结束
特征图(feature map)
卷积层的输出可以看作输入在空间维度上的表征,称为特征图。
感受野(receptive field)
在卷积神经网络中,对于某一层的任意元素,其感受野是指前向计算的所有可能输入区域。
其中,输出层中19的感受野是输入层中的阴影部分。对输出层与2*2的核函数再做互相干运算,输出单个元素z。z的感受野就是输入层的9个元素。更深的卷积神经网络使特征图中单个元素的感受野更加宽阔。
一般来说,假设输入形状 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)
卷积层输出的形状由输入和核窗口形状决定。
目的
防止在连续卷积后,输出太小而导致的有用信息丢失。
定义
在输入的高和宽两侧填充元素(0)。当设置填充 p a d d i n g = n padding = n padding=n时,两侧一共填充 2 n 2n 2n行(列)。
输出形状
( 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 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列
目的
大幅度降低输入大小、高效计算或缩减采样次数
( 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
参数
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
目的
假设输入的通道数为 c i c_i ci,那么卷积核的输入通道数也需要为 c i c_i ci
多通道输入和多通道卷积核之间的二维互相关运算
对每个通道输入的二维张量和卷积核的二维张量进行互相关运算,再对通道求和得到二维张量。
池化层通常作用于卷积层之后。
目的
池化层由一个固定形状的窗口组成,该窗口根据其步幅大小在输入的所有区域上滑动,为池化窗口遍历的每个位置计算一个输出。
(1)最大池化层
返回滑动窗口中的最大值。
作用
(2)平均池化层
返回滑动窗口中的平均值。
作用