读写Tensor

可以直接使用save函数和load函数分别存储和读取Tensorsave使用Python的pickle实用程序将对象进行序列化,然后将序列化的对象保存到disk,使用save可以保存各种对象,包括模型、张量和字典等。而load使用pickle unpickle工具将pickle的对象文件反序列化为内存。

下面的例子创建了Tensor变量x,并将其存在文件名同为x.pt的文件里。

阅读全文 »

不含模型参数的自定义层

先介绍如何定义一个不含模型参数的自定义层。事实上,这和4.1节(模型构造)中介绍的使用Module类构造模型类似。下面的CenteredLayer类通过继承Module类自定义了一个将输入减掉均值后输出的层,并将层的计算定义在了forward函数里。这个层里不含模型参数。

阅读全文 »

导入需要的库,init模块包含了多种模型初始化方法。定义一个含单隐藏层的多层感知机。

1
2
3
4
5
6
7
8
9
import torch
from torch import nn
from torch.nn import init

net = nn.Sequential(nn.Linear(4, 3), nn.ReLU(), nn.Linear(3, 1)) # pytorch已进行默认初始化

print(net)
X = torch.rand(2, 4)
Y = net(X).sum()
阅读全文 »

继承Module类来构造模型

Module类是nn模块里提供的一个模型构造类,是所有神经网络模块的基类,可以继承它来定义想要的模型。下面继承Module类构造一个多层感知机。这里定义的MLP类重载了Module类的__init__函数和forward函数。它们分别用于创建模型参数和定义前向计算。

阅读全文 »

获取和读取数据集

比赛数据分为训练数据集和测试数据集。两个数据集的特征值有连续的数字、离散的标签甚至是缺失值“na”。只有训练数据集包括了每栋房子的价格,也就是标签。

通过pandas库读入并处理数据。

阅读全文 »

衰减和爆炸

当神经网络的层数较多时,模型的数值稳定性容易变差。不考虑偏差参数,且设所有隐藏层的激活函数为恒等映射(identity mapping)\(\phi(x) = x\)。给定输入\(\boldsymbol{X}\),多层感知机的第\(l\)层的输出\(\boldsymbol{H}^{(l)} = \boldsymbol{X} \boldsymbol{W}^{(1)} \boldsymbol{W}^{(2)} \ldots \boldsymbol{W}^{(l)}\)。此时,如果层数\(l\)较大,\(\boldsymbol{H}^{(l)}\)的计算可能会出现衰减或爆炸。假设输入和所有层的权重参数都是标量,如权重参数为0.2和5,多层感知机的第30层输出为输入\(\boldsymbol{X}\)分别与\(0.2^{30} \approx 1 \times 10^{-21}\)(衰减)和\(5^{30} \approx 9 \times 10^{20}\)(爆炸)的乘积。类似地,当层数较多时,梯度的计算也更容易出现衰减或爆炸。

阅读全文 »

正向传播

正向传播是指对神经网络沿着从输入层到输出层的顺序,依次计算并存储模型的中间变量(包括输出)。为简单起见,假设输入是一个特征为\(\boldsymbol{x} \in \mathbb{R}^d\)的样本,且不考虑偏差项,那么中间变量

\[ \boldsymbol{z} = \boldsymbol{W}^{(1)} \boldsymbol{x}, \]

阅读全文 »

方法

除了权重衰减以外,深度学习模型常常使用丢弃法(dropout)来应对过拟合问题。丢弃法有一些不同的变体。本节中提到的丢弃法特指倒置丢弃法(inverted dropout)。

一个单隐藏层的多层感知机,其中输入个数为4,隐藏单元个数为5,且隐藏单元\(h_i\)\(i=1, \ldots, 5\))的计算表达式为

\[ h_i = \phi\left(x_1 w_{1i} + x_2 w_{2i} + x_3 w_{3i} + x_4 w_{4i} + b_i\right) \]

阅读全文 »

范数

L1范数

L1范数是向量中所有元素绝对值的和。对于一个向量 $ w = [w_1, w_2, …, w_n] $,其L1范数定义为:

\[ \|w\|_1 = |w_1| + |w_2| + ... + |w_n| \]

L1范数常用于稀疏性约束,因为它会促使某些权重变为零,从而实现特征选择。

阅读全文 »
0%