提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


文章目录

  • 前言
  • 一、深度学习计算
  • 1.层和块
  • 1.层
  • 2.块
  • 2.多层感知机
  • 3.自定义块
  • 1.块功能
  • 4.小结
  • 4.参数管理
  • 1.目的
  • 2.初始化参数
  • 5.自定义层
  • 1.实现自定义版本的全连接层
  • 6.读写文件
  • 1.加载和保存模型参数
  • 2.总结
  • 二、卷积神经网络
  • 1.从全连接层到卷积
  • 1.多层感知机局限性
  • 2.单隐藏层MLP
  • 3.不变性
  • 1.计算机视觉的神经网络架构
  • 4.重新考察全连接层
  • 1.平移不变性
  • 2.局部性
  • 3.总结
  • 2.卷积层
  • 1.互相关运算
  • 2.二维卷积层
  • 3.交叉相关与卷积
  • 4.总结
  • 5.怎么由XY生成核K
  • 3.填充和步幅
  • 1.填充
  • 1.问题
  • 2.怎么解决呐
  • 2.步幅
  • 3.总结
  • 4.多输入多输出通道
  • 1.多输入通道
  • 2.多输出通道
  • 3.为什么要这样做
  • 4.1X1卷积层
  • 5.二维卷积层
  • 6.总结
  • 5.汇聚层
  • 1.池化层
  • 2.二维最大化层
  • 3.填充和步幅
  • 4.平均池化层
  • 5.总结
  • 6.卷积神经网络
  • 1.LeNet



前言

提示:本文要记录的大概内容:

动手学深度学习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

深度学习代码跑多久_笔记_02

3.不变性

1、假设我们想从一张图片中找到某个物体。 合理的假设是:无论哪种方法找到这个物体,都应该和物体的位置无关。
2、然而沃尔多的样子并不取决于他潜藏的地方,因此我们可以使用一个“沃尔多检测器”扫描图像。 该检测器将图像分割成多个区域,并为每个区域包含沃尔多的可能性打分。
3、卷积神经网络正是将空间不变性(spatial invariance)的这一概念系统化,从而基于这个模型使用较少的参数来学习有用的表示。

1.计算机视觉的神经网络架构

1、平移不变性(translation invariance):不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应,即为“平移不变性”。

2、局部性(locality):神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系,这就是“局部性”原则。最终,可以聚合这些局部特征,以在整个图像级别进行预测。

4.重新考察全连接层

深度学习代码跑多久_卷积_03


深度学习代码跑多久_卷积_04

1.平移不变性

v是权重,ij是位置,平移不变性即v是不随位置改变的

深度学习代码跑多久_人工智能_05


理解成用同一张卷积核遍历整张图片,就是令每个i,j位置权重相等

深度学习代码跑多久_深度学习代码跑多久_06

2.局部性

深度学习代码跑多久_笔记_07

3.总结

深度学习代码跑多久_人工智能_08

2.卷积层

深度学习代码跑多久_卷积_09

1.互相关运算

在卷积层中,输入张量和核张量通过互相关运算产生输出张量。

上一节讲过核不变,与i,j无关

深度学习代码跑多久_卷积_10


深度学习代码跑多久_人工智能_11

2.二维卷积层

深度学习代码跑多久_深度学习代码跑多久_12

3.交叉相关与卷积

深度学习代码跑多久_深度学习代码跑多久_13


深度学习代码跑多久_深度学习_14

4.总结

深度学习代码跑多久_深度学习代码跑多久_15


核矩阵大小影响局部性。

5.怎么由XY生成核K

1、是否可以通过仅查看“输入-输出”对来学习由X生成Y的卷积核。
2、先构造一个卷积层,并将其卷积核初始化为随机张量。接下来,在每次迭代中,我们比较Y与卷积层输出的平方误差,然后计算梯度来更新卷积核。

3.填充和步幅

1、卷积的输出形状取决于输入形状和卷积核的形状。
2、还有什么因素会影响输出的大小呢?本节我们将介绍填充(padding)和步幅(stride)。

1.填充

在应用多层卷积时,我们常常丢失边缘像素。

1.问题

深度学习代码跑多久_卷积_16


不能进行更深的神经网络

2.怎么解决呐

在输入图像的边界填充元素(通常填充元素是0)。

深度学习代码跑多久_深度学习代码跑多久_17


卷积神经网络中卷积核的高度和宽度通常为奇数,例如1、3、5或7。 选择奇数的好处是,保持空间维度的同时,我们可以在顶部和底部填充相同数量的行,在左侧和右侧填充相同数量的列。

深度学习代码跑多久_笔记_18

2.步幅

我们将每次滑动元素的数量称为步幅(stride)。到目前为止,我们只使用过高度或宽度为

的步幅。

深度学习代码跑多久_卷积_19


深度学习代码跑多久_卷积_20

3.总结

深度学习代码跑多久_笔记_21


深度学习代码跑多久_笔记_22

4.多输入多输出通道

1、到目前为止,我们仅展示了单个输入和单个输出通道的简化例子。 这使得我们可以将输入、卷积核和输出看作二维张量。
2、当我们添加通道时,我们的输入和隐藏的表示都变成了三维张量。例如,每个RGB输入图像具有3 X h X w的形状。我们将这个大小为3的轴称为通道(channel)维度。

1.多输入通道

1、例如彩色图像具有标准的RGB通道来代表红、绿和蓝。

2、当输入包含多个通道时,需要构造一个与输入数据具有相同输入通道数的卷积核,以便与输入数据进行互相关运算。

深度学习代码跑多久_笔记_23


深度学习代码跑多久_深度学习_24

2.多输出通道

在最流行的神经网络架构中,随着神经网络层数的加深,我们常会增加输出通道的维数,通过减少空间分辨率以获得更大的通道深度。

深度学习代码跑多久_深度学习代码跑多久_25

3.为什么要这样做

深度学习代码跑多久_卷积_26

4.1X1卷积层

不识别空间模式,只融合通道

深度学习代码跑多久_深度学习代码跑多久_27

5.二维卷积层

深度学习代码跑多久_深度学习_28

6.总结

深度学习代码跑多久_深度学习代码跑多久_29

5.汇聚层

1、通常当我们处理图像时,我们希望逐渐降低隐藏表示的空间分辨率、聚集信息,这样随着我们在神经网络中层叠的上升,每个神经元对其敏感的感受野(输入)就越大。
2、降低卷积层对位置的敏感性,同时降低对空间降采样表示的敏感性。

1.池化层

深度学习代码跑多久_笔记_30

2.二维最大化层

1、与卷积层类似,汇聚层运算符由一个固定形状的窗口组成,该窗口根据其步幅大小在输入的所有区域上滑动,为固定形状窗口(有时称为汇聚窗口)遍历的每个位置计算一个输出。

2、然而,不同于卷积层中的输入与卷积核之间的互相关计算,汇聚层不包含参数。

深度学习代码跑多久_深度学习_31


深度学习代码跑多久_深度学习_32

3.填充和步幅

1、与卷积层一样,汇聚层也可以改变输出形状。和以前一样,我们可以通过填充和步幅以获得所需的输出形状。

2、在处理多通道输入数据时,汇聚层在每个输入通道上单独运算,而不是像卷积层一样在通道上对输入进行汇总。 这意味着汇聚层的输出通道数与输入通道数相同。

深度学习代码跑多久_笔记_33

4.平均池化层

深度学习代码跑多久_笔记_34

5.总结

1、对于给定输入元素,最大汇聚层会输出该窗口内的最大值,平均汇聚层会输出该窗口内的平均值。
2、汇聚层的主要优点之一是减轻卷积层对位置的过度敏感。卷积层之后。
3、我们可以指定汇聚层的填充和步幅。
4、使用最大汇聚层以及大于1的步幅,可减少空间维度(如高度和宽度)。
5、汇聚层的输出通道数与输入通道数相同。

6.卷积神经网络

用卷积层代替全连接层的另一个好处是:模型更简洁、所需的参数更少。

1.LeNet

深度学习代码跑多久_笔记_35


深度学习代码跑多久_笔记_36


深度学习代码跑多久_深度学习_37


在整个卷积块中,与上一层相比,每一层特征的高度和宽度都减小了。

深度学习代码跑多久_深度学习代码跑多久_38