6.1从全连接到卷积

  • 不变性
  • 互相关运算
  • 卷积层
  • 图像中目标的边缘检测
  • 通道/特征映射(feature maps)
  • 感受野

卷积神经网络(convolutional neural networks,CNN)是机器学习利用自然图像中一些已知结构的创造性方法。

卷积 就是一个特殊的全连接层。

不变性

  • 从一张图中寻找某个物体时,识别与物体的位置无关
  • 平移不变性(translation
    invariance):不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应,即为“平移不变性”。
  • 局部性(locality):神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系,这就是“局部性”原则。最终,可以聚合这些局部特征,以在整个图像级别进行预测。

互相关运算

  • 卷积层 将输入X和卷积核矩阵W进行交叉相关,再加上偏移b后得到输出。W和b是可学习的参数,核矩阵的大小是超参数。
  • 输入输出大小关系:(步长为1时)
    输出大小等于输入大小减去卷积核大小,
    ( 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)) 即:

代码实现:

import torch
from torch import nn
from d2l import torch as d2ldef corr2d(X, K):  #@save"""计算二维互相关运算"""h, w = K.shapeY = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1))for i in range(Y.shape[0]):for j in range(Y.shape[1]):Y[i, j] = (X[i:i + h, j:j + w] * K).sum()return Y

用上面的矩阵验证一下:

X = 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)

- **一维和三位互相关运算**

卷积层

  • 卷积层中的两个被训练的参数是卷积核权重和标量偏置。
  • 在训练基于卷积层的模型时,随机初始化卷积核权重。
    在__init__构造函数中,将weight和bias声明为两个模型参数。前向传播函数调用corr2d函数并添加偏置。
class Conv2D(nn.Module):def __init__(self, kernel_size):super().__init__()self.weight = nn.Parameter(torch.rand(kernel_size))self.bias = nn.Parameter(torch.zeros(1))def forward(self, x):return corr2d(x, self.weight) + self.bias

图像中目标的边缘检测

通过找到像素变化的位置,来检测图像中不同颜色的边缘。

  • 垂直边缘检测

    • 首先,我们构造一个6x8像素的黑白图像。中间四列为黑色(0),其余像素为白色(1)。
    • 然后,构造一个高度为1、宽度为2的卷积核K=[1,-1]。当进行互相关运算时,如果水平相邻的两元素相同,则输出为零否则输出为非零(1或-1)
X = torch.ones((6, 8))
X[:, 2:6] = 0
X

K = torch.tensor([[1.0, -1.0]])
Y = corr2d(X, K)
Y

当然X的结构变化时K也要相应变化:如,对X进行转置之后,需要对K也转置一下才能有效
corr2d(X.t(), K.t())

  • 已知目标X→Y,学习满足要求的卷积核

    • 先构造一个卷积层,并将其卷积核初始化为随机张量。
    • 接下来在每次迭代中,比较Y与卷积层输出的平方误差,然后计算梯度来更新卷积核。
    • 简单起见,我使用内置的二维卷积层,并忽略偏置。
# 构造一个二维卷积层,它具有1个输出通道和形状为(1,2)的卷积核
conv2d = nn.Conv2d(1,1, kernel_size=(1, 2), bias=False)# 这个二维卷积层使用四维输入和输出格式(批量大小、通道、高度、宽度),
# 其中批量大小和通道数都为1
X = X.reshape((1, 1, 6, 8))
Y = Y.reshape((1, 1, 6, 7))
lr = 3e-2  # 学习率for i in range(10):Y_hat = conv2d(X)l = (Y_hat - Y) ** 2conv2d.zero_grad() #每次循环将参数梯度置0 避免累加l.sum().backward()# 迭代卷积核conv2d.weight.data[:] -= lr * conv2d.weight.gradif (i + 1) % 2 == 0:print(f'epoch {i+1}, loss {l.sum():.3f}')

在10次迭代之后,误差足够低。此时所学的卷积核的权重张量如下:

conv2d.weight.data.reshape((1, 2))

通道/特征映射(feature maps)

  • 输入图像是三维的:图像不是二维张量,而是一个由高度、宽度和颜色组成的三维张量,比如包含1024x1024x3个像素。前两个轴与像素的空间位置有关,而第三个轴可以看作是每个像素的多维表示。故X表示为[X]i,j,k,卷积核为[V]a,b,c
  • 隐藏层也得是三维的:由于输入图像是三维的,我们的隐藏表示也最好采用三维张量。换句话说,对于每一个空间位置,我们想要采用一组而不是一个隐藏表示。这样一组隐藏表示可以想象成一些互相堆叠的二维网格。
  • 三维隐藏即为通道/特征映射:因此,我们可以把隐藏表示想象为一系列具有二维张量的通道(channel),这些通道也被称为特征映射(feature maps),因为每个通道都向后续层提供一组空间化的学习特征。可以想象,在靠近输入的底层,一些通道专门识别边缘,而一些通道专门识别纹理。

感受野

感受野(Receptive Field) 是指特征图上的某个点能看到的输入图像的区域,即特征图上的点是由输入图像中感受野大小区域的计算得到的(来自所有先前层)。

  • 神经元感受野的值越大表示其能接触到的原始图像范围就越大,也意味着它可能蕴含更为全局,语义层次更高的特征;
  • 相反,值越小则表示其所包含的特征越趋向局部和细节。因此感受野的值可以用来大致判断每一层的抽象层次。
  • 注意,感受野可能大于输入的实际大小!
  • 当一个特征图中的任意元素需要检测更广区域的输入特征时,我们可以构建一个更深的网络。

《动手深度学习》6.1从全连接到卷积相关推荐

  1. 动手深度学习13——计算机视觉:数据增广、图片分类

    文章目录 一.数据增广 1.1 为何进行数据增广? 1.2 常见图片增广方式 1.2.1 翻转 1.2.2 切割(裁剪) 1.2.3 改变颜色 1.2.4 综合使用 1.3 使用图像增广进行训练 1. ...

  2. 【动手深度学习-笔记】注意力机制(一)注意力机制框架

    生物学中的注意力提示 非自主性提示: 在没有主观意识的干预下,眼睛会不自觉地注意到环境中比较突出和显眼的物体. 比如我们自然会注意到一堆黑球中的一个白球,马路上最酷的跑车等. 自主性提示: 在主观意识 ...

  3. 动手深度学习笔记(四十)7.4. 含并行连结的网络(GoogLeNet)

    动手深度学习笔记(四十)7.4. 含并行连结的网络(GoogLeNet) 7.4. 含并行连结的网络(GoogLeNet) 7.4.1. Inception块 7.4.2. GoogLeNet模型 7 ...

  4. 动手深度学习笔记(一)2.1数据操作

    动手深度学习笔记(一) 2. 预备知识 2.1. 数据操作 2.1.1. 入门 2.1.2. 运算符 2.1.3. 广播机制 2.1.4. 索引和切片 2.1.5. 节省内存 2.1.6. 转换为其他 ...

  5. 动手深度学习13:计算机视觉——语义分割、风格迁移

    文章目录 一.语义分割 1.1 语义分割简介 1.2 Pascal VOC2012 语义分割数据集 1.2.1下载.读取数据集 1.2.2 构建字典(RGB颜色值和类名互相映射) 1.2.3 数据预处 ...

  6. 动手深度学习笔记(四十五)8.1. 序列模型

    动手深度学习笔记(四十五)8.1. 序列模型 8.1. 序列模型 8.1.1. 统计工具 8.1.1.1. 自回归模型 8.1.1.2. 马尔可夫模型 8.1.1.3. 因果关系 8.1.2. 训练 ...

  7. 【动手深度学习-笔记】注意力机制(四)自注意力、交叉注意力和位置编码

    文章目录 自注意力(Self-Attention) 例子 Self-Attention vs Convolution Self-Attention vs RNN 交叉注意力(Cross Attenti ...

  8. 深度学习100例 | 第25天-卷积神经网络(CNN):中文手写数字识别

    大家好,我是『K同学啊』! 接着上一篇文章 深度学习100例 | 第24天-卷积神经网络(Xception):动物识别,我用Xception模型实现了对狗.猫.鸡.马等四种动物的识别,带大家了解了Xc ...

  9. 深度学习笔记(29) 1×1 卷积

    深度学习笔记(29) 1×1 卷积 1. 1×1 卷积 2. 1×1 卷积的作用 3. 1×1 卷积的应用 1. 1×1 卷积 在架构内容设计方面,其中一个比较有帮助的想法是使用1×1卷积 过滤器为1 ...

最新文章

  1. 多核服务器的JVM优化选项(转载)
  2. 从零开始入门 K8s | Kata Containers 创始人带你入门安全容器技术
  3. 去雾综述_【综述】图像去雾的前世今生
  4. 进阶篇-安卓系统:5.安卓手机位置传感器
  5. python学习笔记——类
  6. Java基础学习总结(173)——Java 8到Java 15新功能总结
  7. 73. 文件上传函数封装
  8. 想要下载,却没有积分,CSDN你做个人吧
  9. Python-爬虫抓取视频
  10. 工业以太网EtherNet/IP协议安全分析整理
  11. android espresso 教程,Android Espresso入门到自动搞定
  12. 计算机组成原理笔记(王道考研) 第七章:输入输出系统
  13. 观察者模式实际应用场景「扩展点实战系列」- 第439篇
  14. 请每一个孝顺的子女耐心的看下去!
  15. 使用QT对接大华网络摄像头SDK的示例程序(建议收藏)
  16. uni-app watch事件监听三种用法
  17. 成都,今夜请将我遗忘 读后感
  18. php 红宝石,红宝石-世界名贵宝石排行榜-天天排行网
  19. Vim 利剑常磨,见血封喉 1
  20. 宜信唐宁忠告北大毕业生 日进斗金不如守住初心

热门文章

  1. 为什么桌面不显示计算机,电脑显示器不满屏怎么办
  2. 游戏服务器领域的 “状态同步”、“非状态同步”
  3. 十大跑步运动耳机品牌排行榜,目前热销的运动耳机推荐
  4. STL学习--vector的学习
  5. mysql的MVCC机制详解
  6. Deep Reinforcement Learning Approach to Solve Dynamic Vehicle Routing Problem with Stochastic Custom
  7. python 字符串去空格_Python字符串空格处理
  8. UnityWebRequest通信
  9. 树结构如何在关系型数据库中存储
  10. MATLAB的reshape函数