网站优化方案ppt,电脑做服务器发布网站吗,外贸型企业网站建设,广告设计专业是干什么的上节了解了卷积层的原理#xff0c;本节以图像为例#xff0c;介绍一下它的实际应用 1 互相关运算
严格来说#xff0c;卷积层是个错误的叫法#xff0c;因为它所表达的运算其实是互相关运算#xff08;cross-correlation#xff09;。
首先#xff0c;我们暂时忽略通… 上节了解了卷积层的原理本节以图像为例介绍一下它的实际应用 1 互相关运算
严格来说卷积层是个错误的叫法因为它所表达的运算其实是互相关运算cross-correlation。
首先我们暂时忽略通道第三维这一情况看看如何处理二维图像数据和隐藏表示。输入的二维张量形状是 3 × 3 3 \times 3 3×3卷积核的形状是 2 × 2 2\times2 2×2计算如下图 在二维互相关运算中卷积窗口从输入张量的左上角开始从左到右、从上到下滑动。 当卷积窗口滑动到新一个位置时包含在该窗口中的部分张量与卷积核张量进行按元素相乘计算步骤如下 0 × 0 1 × 1 3 × 2 4 × 3 19 , 1 × 0 2 × 1 4 × 2 5 × 3 25 , 3 × 0 4 × 1 6 × 2 7 × 3 37 , 4 × 0 5 × 1 7 × 2 8 × 3 43. \begin{split}0\times01\times13\times24\times319,\\ 1\times02\times14\times25\times325,\\ 3\times04\times16\times27\times337,\\ 4\times05\times17\times28\times343.\end{split} 0×01×13×24×319,1×02×14×25×325,3×04×16×27×337,4×05×17×28×343.
输出大小等于输入大小 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_h1) \times (n_w-k_w1). (nh−kh1)×(nw−kw1). 下面是手动实现一个二维互相关运算
import torch# x是输入张量k是卷积核张量
def corr2d(x,k):# 确定输出张量的大小ytorch.zeros(x.shape[0]-k.shape[0]1,x.shape[1]-k.shape[1]1)for i in range(y.shape[0]):for j in range(y.shape[1]):y[i,j](x[i:ik.shape[0],j:jk.shape[1]]*k).sum()#X[i:i h, j:j w] 提取输入矩阵 X 中从位置 (i, j) 开始大小与卷积核 K 相同的子区域。return yX torch.tensor([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]])
K torch.tensor([[0.0, 1.0], [2.0, 3.0]])
corr2d(X, K)运行结果
2 卷积层
卷积层对输入和卷积核权重进行互相关运算并在添加标量偏置之后产生输出。 所以卷积层中的两个被训练的参数是卷积核权重和标量偏置。
下面将基于上面定义的corr2d函数实现二维卷积层。在__init__构造函数中将weight和bias声明为两个模型参数。前向传播函数调用corr2d函数并添加偏置。
class Conv2d(nn.Module):def __init__(self,kernel_size):super().__init__()self.weightnn.Parameter(torch.rand(kernel_size))self.biasnn.Parameter(torch.zeros(1))def forward(self,x):return corr2d(x,self.weight)self.bias# 对输入和卷积核权重进行互相关运算并在添加标量偏置之后产生输出3 图像中目标的边缘检测
如下是卷积层的一个简单应用通过找到像素变化的位置来检测图像中不同颜色的边缘。 首先我们构造一个 6 × 8 6\times8 6×8像素的黑白图像:
import matplotlib.pyplot as plt
X torch.ones((6, 8))
X[:, 2:6] 0
print(X)可视化一下是下面这样
接下来我们构造一个 1 × 2 1\times2 1×2的卷积核 k k k数值为 [ 1.0 , − 1.0 ] [1.0, -1.0] [1.0,−1.0]观察矩阵可知当进行互相关运算时
如果水平相邻的元素相同则输出为零如果水平相邻的元素不同则输出为非零
现在进行运算
K torch.tensor([[1.0, -1.0]])
Y corr2d(X, K)
Y运行结果 结果分析 输出Y中的1代表从白色到黑色的边缘-1代表从黑色到白色的边缘其他情况的输出为0
但是如果我们把输入的二维图像转置再进行互相关运算输出如下
corr2d(X.t(), K)运行结果 说明该卷积核只能检测垂直边缘无法检测水平边缘
4 卷积核
上述检测黑白边缘的例子中我么使用的是 [ 1 , − 1 ] [1,-1] [1,−1]的卷积核但是面对更加复杂或者连续的卷积层时手动设计卷积核不现实所以我们希望通过计算梯度来自动更新卷积核。
下面我们将使用内置的卷积层并暂时忽略偏置这里补充一点nn.Conv2d的输入格式和输出格式都是 批量大小、通道、高度、宽度 批量大小、通道、高度、宽度 批量大小、通道、高度、宽度
# 构造一个二维卷积层它具有1个输出通道和形状为12的卷积核
conv2d nn.Conv2d(1,1, kernel_size(1, 2), biasFalse)# 其中批量大小和通道数都为1
X X.reshape((1, 1, 6, 8))
Y Y.reshape((1, 1, 6, 7))
lr 0.001 # 学习率for i in range(400):Y_hat conv2d(X)l (Y_hat - Y) ** 2conv2d.zero_grad()l.sum().backward()# 迭代卷积核conv2d.weight.data[:] - lr * conv2d.weight.gradif (i 1) % 100 0:print(fepoch {i1}, loss {l.sum():.3f})conv2d.weight.data.reshape((1, 2))# 输出卷积核的权重张量运行结果 可以看到400次迭代后误差已经足够低了而且卷积核的权重是 [ 0.9910 , − 0.9910 ] [ 0.9910, -0.9910] [0.9910,−0.9910]已经非常接近我们之前定义的卷积核的权重了
5 特征映射和感受野
①特征映射输出的卷积层有时被称为特征映射feature map因为它可以被视为一个输入映射到下一层的空间维度的转换器。
②感受野在卷积神经网络中对于某一层的任意元素 x x x其感受野是指在前向传播期间可能影响 x x x计算的所有元素来自所有先前层。