【d2l.ai】经典深度学习网络
2inc

多层感知机

多层感知机的简洁实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import torch
from torch import nn
from d2l import torch as d2l # 多层感知机的简洁实现

import torch
from torch import nn
from d2l import torch as d2l

net = nn.Sequential(nn.Flatten(),
nn.Linear(784,256),
nn.ReLU(),
nn.Linear(256,10)
)

# 建立模型
def init_weights(m):
if type(m) == nn.Linear:
nn.init.normal_(m.weight, std = 0.01)

net.apply(init_weights);

batch_size, lr, num_epochs = 256, 0.1, 10
loss = nn.CrossEntropyLoss(reduction='none')
trainer = torch.optim.SGD(net.parameters(), lr=lr)

train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)>)

模型选择、欠拟合和过拟合

训练误差:训练数据集上计算得到的误差
泛化误差:(对于其他数据集)在无限多数据样本中模型误差的期望

模型选择

训练集:训练模型,获取参数
验证集:调整模型超参数,并选取最佳参数
测试集:验证模型,训练和验证的过程不能使用测试集

当训练数据稀缺,采用 K 折交叉验证,分出 K 个子集,进行 K 次训练,每次使用不同的子集作为验证集,其余 K -1 个子集作为训练集

总结

模型容量需要匹配数据复杂度
统计机器学习提供数学工具来衡量模型复杂度
实际中一般靠观察训练误差和验证误差

神经网络计算

层和块

  • 一个块可以由许多层组成;一个块可以由许多块组成。
  • 块可以包含代码。
  • 块负责大量的内部处理,包括参数初始化和反向传播。
  • 层和块的顺序连接由 Sequential 块处理。

参数管理

  • 访问参数,用于调试、诊断和可视化;
  • 参数初始化;
  • 在不同模型组件间共享参数。

参数是复合的对象,包含属性、值等等

1
nn.init.normal_(m.weight, mean=0, std=0.01) # 替换函数

CNN 卷积神经网络

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

6.1 从全连接层到卷积

两个原则:平移不变性、局部性
重新考量全连接层:权重变为四维,输入输出变为矩阵
17059149074721705914906610.png

6.2 图像卷积

6.3 填充和步幅

假设输入形状为 ,卷积核形状为 ,那么输出形状将是()。 因此,卷积的输出形状取决于输入形状和卷积核的形状。

填充

填充多少行,输出多多少行
通常情况,需要填充 行,使得输入和输出维度相同,此时, 通常为奇数(1 3 5)

步幅

通常为了高效计算或者缩减采样次数

6.4 多输入多输出通道

6.5 汇聚层

也叫池化层

6.6 卷积神经网络(LeNet)

17218412095491721841208964.png

1
2
3
4
5
6
7
8
9
10
11
12
13
import torch
from torch import nn
from d2l import torch as d2l

net = nn.Sequential(
nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.Sigmoid(),
nn.AvgPool2d(kernel_size=2, stride=2),
nn.Conv2d(6, 16, kernel_size=5), nn.Sigmoid(),
nn.AvgPool2d(kernel_size=2, stride=2),
nn.Flatten(),
nn.Linear(16 * 5 * 5, 120), nn.Sigmoid(),
nn.Linear(120, 84), nn.Sigmoid(),
nn.Linear(84, 10))

Modern CNN

深度卷积神经网络 AlexNet

  • 本质上是更深更大的 LeNet
  • 17218412675461721841266754.png

VGG 使用块的网络

网络中的网络 NiN

  • 对每个像素的位置独立使用全连接层

17218412945511721841294162.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import torch
from torch import nn
from d2l import torch as d2l
def nin_block(in_channels, out_channels, kernel_size, strides, padding):
return nn.Sequential(
nn.Conv2d(in_channels, out_channels, kernel_size, strides, padding),
nn.ReLU(),
nn.Conv2d(out_channels, out_channels, kernel_size=1), nn.ReLU(),
nn.Conv2d(out_channels, out_channels, kernel_size=1), nn.ReLU())

net = nn.Sequential(
nin_block(1, 96, kernel_size=11, strides=4, padding=0),
nn.MaxPool2d(3, stride=2),
nin_block(96, 256, kernel_size=5, strides=1, padding=2),
nn.MaxPool2d(3, stride=2),
nin_block(256, 384, kernel_size=3, strides=1, padding=1),
nn.MaxPool2d(3, stride=2),
nn.Dropout(0.5),
# 标签类别数是10
nin_block(384, 10, kernel_size=3, strides=1, padding=1),
nn.AdaptiveAvgPool2d((1, 1)),
# 将四维的输出转成二维的输出,其形状为(批量大小,10)
nn.Flatten())

残差网络 ResNet

确保新的映射包含原有的映射,防止网络是退化的

RNN 循环神经网络

循环神经网络可以很好的处理序列信息

序列模型

  • 研究的是序列预测问题:
    • 两个策略:自回归模型和因变量自回归模型
    • 马尔可夫模型
      • 假设当前只跟少数数据相关,简化模型
    • 潜变量模型
      • 潜变量概括历史信息
      • 17218414365451721841436117.png

文本预处理

  • 主要预处理步骤:拆分为次元,建立词表,映射到数字索引
    • tokenize nlp 中最常见的操作
    • 中文的分词使用 jieba

语言模型和数据集

  • 目标:估计联合概率
  • 面对问题:对文档或者词元序列进行建模
    • 通过计数
    • 常用统计方法:n 元语法,基于马尔可夫的统计模型
  • 随机采样
    • 基于随机的偏移量,不重叠、不相邻地划分序列
    • corpus, batch_size, num_steps:整个序列、小批量的大小,每一个子序列的长度
  • 顺序分区
    • 保证两个相邻的小批量中的子序列在原始序列上也是相邻的

循环神经网络

对于序列模型的神经网络,RNN

  • 输出、隐变量、观察
    • 17218414645451721841464111.png
    • 隐变量和观察一起作为自变量,控制输出的隐变量
    • o_t ~ h_t
    • H_t ~ h_t-1, x_t-1
      • 拿掉 h_t-1 退化为 MLP
    • 输出以及隐变量(的计算)在观察之前
    • 观察是用于更新下一个单元,相当于观察既是输入也是标签
    • 有点像因果系统(?),包含了时间信息
  • 困惑度
    • 衡量一个语言模型的好坏可以用平均交叉熵
    • 困惑度取指数,来衡量,是平均每次可能选项
    • 困惑度最好值是 1
  • 梯度剪裁
  • RNN 的应用
    • 文本生成:一个生多个
    • 文本分类:多个生一个
    • 问答、翻译:同时多个生成同时多个,有时间先后
    • Tag 生成:对每个词进行生成
 评论
评论插件加载失败
正在加载评论插件