《动手深度学习》6.1从全连接到卷积
6.1从全连接到卷积
- 不变性
- 互相关运算
- 卷积层
- 图像中目标的边缘检测
- 通道/特征映射(feature maps)
- 感受野
卷积神经网络(convolutional neural networks,CNN)是机器学习利用自然图像中一些已知结构的创造性方法。
卷积 就是一个特殊的全连接层。
不变性
- 从一张图中寻找某个物体时,识别与物体的位置无关。
- 平移不变性(translation
invariance):不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应,即为“平移不变性”。 - 局部性(locality):神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系,这就是“局部性”原则。最终,可以聚合这些局部特征,以在整个图像级别进行预测。
互相关运算
![](/assets/blank.gif)
![](/assets/blank.gif)
- 卷积层 将输入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)) 即:
![](/assets/blank.gif)
代码实现:
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)
- **一维和三位互相关运算**
![](/assets/blank.gif)
卷积层
- 卷积层中的两个被训练的参数是卷积核权重和标量偏置。
- 在训练基于卷积层的模型时,随机初始化卷积核权重。
在__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),因为每个通道都向后续层提供一组空间化的学习特征。可以想象,在靠近输入的底层,一些通道专门识别边缘,而一些通道专门识别纹理。
感受野
![](/assets/blank.gif)
感受野(Receptive Field) 是指特征图上的某个点能看到的输入图像的区域,即特征图上的点是由输入图像中感受野大小区域的计算得到的(来自所有先前层)。
![](/assets/blank.gif)
- 神经元感受野的值越大表示其能接触到的原始图像范围就越大,也意味着它可能蕴含更为全局,语义层次更高的特征;
- 相反,值越小则表示其所包含的特征越趋向局部和细节。因此感受野的值可以用来大致判断每一层的抽象层次。
- 注意,感受野可能大于输入的实际大小!
- 当一个特征图中的任意元素需要检测更广区域的输入特征时,我们可以构建一个更深的网络。
《动手深度学习》6.1从全连接到卷积相关推荐
- 动手深度学习13——计算机视觉:数据增广、图片分类
文章目录 一.数据增广 1.1 为何进行数据增广? 1.2 常见图片增广方式 1.2.1 翻转 1.2.2 切割(裁剪) 1.2.3 改变颜色 1.2.4 综合使用 1.3 使用图像增广进行训练 1. ...
- 【动手深度学习-笔记】注意力机制(一)注意力机制框架
生物学中的注意力提示 非自主性提示: 在没有主观意识的干预下,眼睛会不自觉地注意到环境中比较突出和显眼的物体. 比如我们自然会注意到一堆黑球中的一个白球,马路上最酷的跑车等. 自主性提示: 在主观意识 ...
- 动手深度学习笔记(四十)7.4. 含并行连结的网络(GoogLeNet)
动手深度学习笔记(四十)7.4. 含并行连结的网络(GoogLeNet) 7.4. 含并行连结的网络(GoogLeNet) 7.4.1. Inception块 7.4.2. GoogLeNet模型 7 ...
- 动手深度学习笔记(一)2.1数据操作
动手深度学习笔记(一) 2. 预备知识 2.1. 数据操作 2.1.1. 入门 2.1.2. 运算符 2.1.3. 广播机制 2.1.4. 索引和切片 2.1.5. 节省内存 2.1.6. 转换为其他 ...
- 动手深度学习13:计算机视觉——语义分割、风格迁移
文章目录 一.语义分割 1.1 语义分割简介 1.2 Pascal VOC2012 语义分割数据集 1.2.1下载.读取数据集 1.2.2 构建字典(RGB颜色值和类名互相映射) 1.2.3 数据预处 ...
- 动手深度学习笔记(四十五)8.1. 序列模型
动手深度学习笔记(四十五)8.1. 序列模型 8.1. 序列模型 8.1.1. 统计工具 8.1.1.1. 自回归模型 8.1.1.2. 马尔可夫模型 8.1.1.3. 因果关系 8.1.2. 训练 ...
- 【动手深度学习-笔记】注意力机制(四)自注意力、交叉注意力和位置编码
文章目录 自注意力(Self-Attention) 例子 Self-Attention vs Convolution Self-Attention vs RNN 交叉注意力(Cross Attenti ...
- 深度学习100例 | 第25天-卷积神经网络(CNN):中文手写数字识别
大家好,我是『K同学啊』! 接着上一篇文章 深度学习100例 | 第24天-卷积神经网络(Xception):动物识别,我用Xception模型实现了对狗.猫.鸡.马等四种动物的识别,带大家了解了Xc ...
- 深度学习笔记(29) 1×1 卷积
深度学习笔记(29) 1×1 卷积 1. 1×1 卷积 2. 1×1 卷积的作用 3. 1×1 卷积的应用 1. 1×1 卷积 在架构内容设计方面,其中一个比较有帮助的想法是使用1×1卷积 过滤器为1 ...
最新文章
- 多核服务器的JVM优化选项(转载)
- 从零开始入门 K8s | Kata Containers 创始人带你入门安全容器技术
- 去雾综述_【综述】图像去雾的前世今生
- 进阶篇-安卓系统:5.安卓手机位置传感器
- python学习笔记——类
- Java基础学习总结(173)——Java 8到Java 15新功能总结
- 73. 文件上传函数封装
- 想要下载,却没有积分,CSDN你做个人吧
- Python-爬虫抓取视频
- 工业以太网EtherNet/IP协议安全分析整理
- android espresso 教程,Android Espresso入门到自动搞定
- 计算机组成原理笔记(王道考研) 第七章:输入输出系统
- 观察者模式实际应用场景「扩展点实战系列」- 第439篇
- 请每一个孝顺的子女耐心的看下去!
- 使用QT对接大华网络摄像头SDK的示例程序(建议收藏)
- uni-app watch事件监听三种用法
- 成都,今夜请将我遗忘 读后感
- php 红宝石,红宝石-世界名贵宝石排行榜-天天排行网
- Vim 利剑常磨,见血封喉 1
- 宜信唐宁忠告北大毕业生 日进斗金不如守住初心
热门文章
- 为什么桌面不显示计算机,电脑显示器不满屏怎么办
- 游戏服务器领域的 “状态同步”、“非状态同步”
- 十大跑步运动耳机品牌排行榜,目前热销的运动耳机推荐
- STL学习--vector的学习
- mysql的MVCC机制详解
- Deep Reinforcement Learning Approach to Solve Dynamic Vehicle Routing Problem with Stochastic Custom
- python 字符串去空格_Python字符串空格处理
- UnityWebRequest通信
- 树结构如何在关系型数据库中存储
- MATLAB的reshape函数