提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:本文要记录的大概内容:
动手学深度学习v2 ------ 沐神
提示:以下是本篇文章正文内容
一、深度学习计算
1.层和块
1.层
1、像单个神经元一样,层
(1)接受一组输入, (2)生成相应的输出, (3)由一组可调整参数描述。
2、当我们使用softmax回归时,一个单层本身就是模型。
3、对于多层感知机而言,整个模型及其组成层都是这种架构。每个单独的层接收输入(由前一层提供), 生成输出(到下一层的输入),并且具有一组可调参数, 这些参数根据从下一层反向传播的信号进行更新。
2.块
块(block)可以描述单个层、由多个层组成的组件或整个模型本身。
从编程的角度来看,块由类(class)表示。 它的任何子类都必须定义一个将其输入转换为输出的前向传播函数, 并且必须存储任何必需的参数。
2.多层感知机
下面的代码生成一个网络,其中包含一个具有256个单元和ReLU激活函数的全连接隐藏层, 然后是一个具有10个隐藏单元且不带激活函数的全连接输出层。
import torch
from torch import nn
from torch.nn import functional as F
net = nn.Sequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10))
X = torch.rand(2, 20)
net(X)
我们添加了2个全连接层(之前我们只添加了1个全连接层)。 第一层是隐藏层,它包含256个隐藏单元,并使用了ReLU激活函数。 第二层是输出层。
3.自定义块
1.块功能
1.将输入数据作为其前向传播函数的参数。
2.通过前向传播函数来生成输出。请注意,输出的形状可能与输入的形状不同。例如,我们上面模型中的第一个全连接的层接收一个20维的输入,但是返回一个维度为256的输出。
3.计算其输出关于输入的梯度,可通过其反向传播函数进行访问。通常这是自动发生的。
4.存储和访问前向传播计算所需的参数。
5.根据需要初始化模型参数。
4.小结
1、一个块可以由许多层组成;一个块可以由许多块组成。
2、块可以包含代码。
3、块负责大量的内部处理,包括参数初始化和反向传播。
4、层和块的顺序连接由Sequential块处理。
4.参数管理
我们的目标是找到使损失函数最小化的模型参数值。
1.目的
1.访问参数,用于调试、诊断和可视化;
2.参数初始化;
3.在不同模型组件间共享参数。
一个具有单隐藏层的多层感知机。
import torch
from torch import nn
net = nn.Sequential(nn.Linear(4, 8), nn.ReLU(), nn.Linear(8, 1))
X = torch.rand(size=(2, 4))
net(X)
2.初始化参数
默认情况下,PyTorch会根据一个范围均匀地初始化权重和偏置矩阵, 这个范围是根据输入和输出维度计算出的。
下面的代码将所有权重参数初始化为标准差为0.01的高斯随机变量, 且将偏置参数设置为0。
def init_normal(m):
if type(m) == nn.Linear:
nn.init.normal_(m.weight, mean=0, std=0.01)
nn.init.zeros_(m.bias)
net.apply(init_normal)
net[0].weight.data[0], net[0].bias.data[0]
5.自定义层
我们可以用创造性的方式组合不同的层,从而设计出适用于各种任务的架构。
1.实现自定义版本的全连接层
class MyLinear(nn.Module):
def __init__(self, in_units, units):
super().__init__()
self.weight = nn.Parameter(torch.randn(in_units, units))
self.bias = nn.Parameter(torch.randn(units,))
def forward(self, X):
linear = torch.matmul(X, self.weight.data) + self.bias.data
return F.relu(linear)
该层需要两个参数,一个用于表示权重,另一个用于表示偏置项。 在此实现中,我们使用修正线性单元作为激活函数。 该层需要输入参数:in_units和units,分别表示输入数和输出数。
6.读写文件
如何加载和存储权重向量和整个模型了。
1.加载和保存模型参数
深度学习框架提供了内置函数来保存和加载整个网络。 需要注意的一个重要细节是,这将保存模型的参数而不是保存整个模型。
2.总结
save和load函数可用于张量对象的文件读写。
我们可以通过参数字典保存和加载网络的全部参数。
保存架构必须在代码中完成,而不是在参数中完成。
二、卷积神经网络
1.从全连接层到卷积
1.多层感知机局限性
1、我们之前讨论的多层感知机十分适合处理表格数据,其中行对应样本,列对应特征。
2、对于表格数据,我们寻找的模式可能涉及特征之间的交互,但是我们不能预先假设任何与特征交互相关的先验结构。
3、然而对于高维感知数据,这种缺少结构的网络可能会变得不实用。
4、例如,数据集中是拥有标注的照片,每张照片具有百万级像素,这意味着网络的每次输入都有一百万个维度。想要训练这个模型将不可实现。
5、 卷积神经网络(convolutional neural networks,CNN)是机器学习利用自然图像中一些已知结构的创造性方法。
2.单隐藏层MLP
3.不变性
1、假设我们想从一张图片中找到某个物体。 合理的假设是:无论哪种方法找到这个物体,都应该和物体的位置无关。
2、然而沃尔多的样子并不取决于他潜藏的地方,因此我们可以使用一个“沃尔多检测器”扫描图像。 该检测器将图像分割成多个区域,并为每个区域包含沃尔多的可能性打分。
3、卷积神经网络正是将空间不变性(spatial invariance)的这一概念系统化,从而基于这个模型使用较少的参数来学习有用的表示。
1.计算机视觉的神经网络架构
1、平移不变性(translation invariance):不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应,即为“平移不变性”。
2、局部性(locality):神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系,这就是“局部性”原则。最终,可以聚合这些局部特征,以在整个图像级别进行预测。
4.重新考察全连接层
1.平移不变性
v是权重,ij是位置,平移不变性即v是不随位置改变的
理解成用同一张卷积核遍历整张图片,就是令每个i,j位置权重相等
2.局部性
3.总结
2.卷积层
1.互相关运算
在卷积层中,输入张量和核张量通过互相关运算产生输出张量。
上一节讲过核不变,与i,j无关
2.二维卷积层
3.交叉相关与卷积
4.总结
核矩阵大小影响局部性。
5.怎么由XY生成核K
1、是否可以通过仅查看“输入-输出”对来学习由X生成Y的卷积核。
2、先构造一个卷积层,并将其卷积核初始化为随机张量。接下来,在每次迭代中,我们比较Y与卷积层输出的平方误差,然后计算梯度来更新卷积核。
3.填充和步幅
1、卷积的输出形状取决于输入形状和卷积核的形状。
2、还有什么因素会影响输出的大小呢?本节我们将介绍填充(padding)和步幅(stride)。
1.填充
在应用多层卷积时,我们常常丢失边缘像素。
1.问题
不能进行更深的神经网络
2.怎么解决呐
在输入图像的边界填充元素(通常填充元素是0)。
卷积神经网络中卷积核的高度和宽度通常为奇数,例如1、3、5或7。 选择奇数的好处是,保持空间维度的同时,我们可以在顶部和底部填充相同数量的行,在左侧和右侧填充相同数量的列。
2.步幅
我们将每次滑动元素的数量称为步幅(stride)。到目前为止,我们只使用过高度或宽度为
的步幅。
3.总结
4.多输入多输出通道
1、到目前为止,我们仅展示了单个输入和单个输出通道的简化例子。 这使得我们可以将输入、卷积核和输出看作二维张量。
2、当我们添加通道时,我们的输入和隐藏的表示都变成了三维张量。例如,每个RGB输入图像具有3 X h X w的形状。我们将这个大小为3的轴称为通道(channel)维度。
1.多输入通道
1、例如彩色图像具有标准的RGB通道来代表红、绿和蓝。
2、当输入包含多个通道时,需要构造一个与输入数据具有相同输入通道数的卷积核,以便与输入数据进行互相关运算。
2.多输出通道
在最流行的神经网络架构中,随着神经网络层数的加深,我们常会增加输出通道的维数,通过减少空间分辨率以获得更大的通道深度。
3.为什么要这样做
4.1X1卷积层
不识别空间模式,只融合通道
5.二维卷积层
6.总结
5.汇聚层
1、通常当我们处理图像时,我们希望逐渐降低隐藏表示的空间分辨率、聚集信息,这样随着我们在神经网络中层叠的上升,每个神经元对其敏感的感受野(输入)就越大。
2、降低卷积层对位置的敏感性,同时降低对空间降采样表示的敏感性。
1.池化层
2.二维最大化层
1、与卷积层类似,汇聚层运算符由一个固定形状的窗口组成,该窗口根据其步幅大小在输入的所有区域上滑动,为固定形状窗口(有时称为汇聚窗口)遍历的每个位置计算一个输出。
2、然而,不同于卷积层中的输入与卷积核之间的互相关计算,汇聚层不包含参数。
3.填充和步幅
1、与卷积层一样,汇聚层也可以改变输出形状。和以前一样,我们可以通过填充和步幅以获得所需的输出形状。
2、在处理多通道输入数据时,汇聚层在每个输入通道上单独运算,而不是像卷积层一样在通道上对输入进行汇总。 这意味着汇聚层的输出通道数与输入通道数相同。
4.平均池化层
5.总结
1、对于给定输入元素,最大汇聚层会输出该窗口内的最大值,平均汇聚层会输出该窗口内的平均值。
2、汇聚层的主要优点之一是减轻卷积层对位置的过度敏感。卷积层之后。
3、我们可以指定汇聚层的填充和步幅。
4、使用最大汇聚层以及大于1的步幅,可减少空间维度(如高度和宽度)。
5、汇聚层的输出通道数与输入通道数相同。
6.卷积神经网络
用卷积层代替全连接层的另一个好处是:模型更简洁、所需的参数更少。
1.LeNet
在整个卷积块中,与上一层相比,每一层特征的高度和宽度都减小了。
高宽减半,通道数翻倍