《动手学习深度学习》读书笔记

这本书的官网:http://zh.d2l.ai/

B站网址:https://space.bilibili.com/209599371/channel/detail?cid=23541

Pytorch版本:https://github.com/ShusenTang/Dive-into-DL-PyTorch

github网址:https://github.com/d2l-ai/d2l-zh

 

总结:这本书更偏向实践,对于理论的说明过少,如果看不懂,可以先看《深度学习入门 基于Python的理论与实现》,之后在看这本书。

 

 

第2章 预备知识

2.3 自动求梯度

这个小节,主要介绍了MXNet提供的autograd模块来自动求梯度。

 

第3章 深度学习基础

3.2节 线性回归的从零开始

本小节主要讲解了,在给定的一个线性函数的F(x)的情况下(权重和偏差已知),随机生成数据集,小批量读取数据集,初始化模型参数,定义模型,定义损失函数,定义优化算法,训练模型,这样一步步的,最终得出训练模型的权重和偏差,发现训练出来的权重和偏差与真实的权重和偏差已经很接近了。

这个过程,是深度学习的入门,从这个小节中可以知道,深度学习的大致过程。

3.3线性回归的简洁实现

本小节使用 MXNet提供的Gluon接口现实线性回归的训练。与3.2节在步骤过程中没有差异。

定义模型

from mxnet.gluon import nn

net = nn.Sequential()

net.add(nn.Dense(1))

初始化模型参数

from mxnet import init

net.initialize(init.Normal(sigma=0.01))

定义损失函数

from mxnet.gluon import loss as gloss

loss = gloss.L2Loss()  # 平方损失又称L2范数损失

定义优化算法

from mxnet import gluon

trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': 0.03})

训练模型 num_epochs = 3
for epoch in range(1, num_epochs + 1):
    for X, y in data_iter:
        with autograd.record():
            l = loss(net(X), y)
        l.backward()
        trainer.step(batch_size)
    l = loss(net(features), labels)
    print('epoch %d, loss: %f' % (epoch, l.mean().asnumpy()))

3.4 softmax回归

线性回归适用于连续的值,而对于离散的值应该使用softmax回归。

交叉熵损失函数,

 

第4章 深度学习技术

4.1 模型构造

nn.Block类,是一个一般化的部件,整个神经网络可以是一个nn.block,单层也是一个nn.block,我们可以(近似)无限地嵌套nn.block来构建新的nn.block。

4.2 模型参数的访问、初始化和共享

init模块,包含了多种模型初始化方法。

params属性,用来访问该层包含的所有参数。

使用变量名(weight)来访问权重参数。同时使用weight.data函数和weight.grad函数访问它的参数和梯度的数值。

使用collect_params函数来获取net变量所有嵌套(例如通过add函数嵌套)的层所包含的所有参数。

# 非首次对模型初始化需要指定force_reinit为真
# 初始化成均值为0,标准差为0.01,的正态分布
net.initialize(init=init.Normal(sigma=0.01), force_reinit=True)

# 初始化为常数1
net.initialize(init=init.Constant(1), force_reinit=True)

# 初始化为 Xavier随机初始化。
net[0].weight.initialize(init=init.Xavier(), force_reinit=True)

使用 Initializer类的子类来自定义初始化。

使用set_data函数直接修改模型的参数。

共享模型参数:在多个层之间共享模型参数。

4.3 模型参数的延后初始化

当调用initialize函数时,此时还不知道隐藏层输入个数,只有当做前向计算net(x)时,此时才真正开始初始化参数。

4.4 自定义层

通过继承block类来自定义层。

4.5 读取和存储

将训练好的模型参数存储在硬盘上供后续读取使用。

 

第5章 卷积神经网络

5.1 二维卷积层

二维卷积层:有高和宽两个维度,常用来处理图像数据。

互相关运算:对应位置的元素相乘。不是点积运算(矩阵相乘)。

二维卷积层将输入和卷积核做互相关运算,并加上一个标量偏差来得到输出。卷积层的模型参数包括了卷积核和标量偏差。

在训练模型的时候,通常我们先对卷积核随机初始化,然后不断迭代卷积核和偏差。

问题:卷积层为何使用互相关运算而不是卷积运算????答:在深度学习中核数组都是学习出来的(卷积层无论使用互相关运算或者是卷积运算都不影响模型预测时的输出)。

5.2 填充和步幅

填充(padding):可以增加输出的高和宽

步幅(stride):可以减少输出的高和宽。

5.3 多输入通道和多输出通道

彩色图像在高河宽2个维度外,还有RGB(红绿蓝)3个颜色通道。

5.4 池化层

卷积层的提出是为了缓解卷积层对位置的过度敏感。

5.5 卷积神经网络(LeNet)

1994年提出,第一作者是Yann LeCun,LeNet展示了通过梯度下降训练卷积神经网络可以达到手写数字识别在当时最先进的结果。

书里面讲的不详细,参考:https://blog.csdn.net/daydayup_668819/article/details/79932548

https://www.cnblogs.com/alexcai/p/5506806.html

5.6 深度卷积神经网络(AlexNet)

2012年提出,第一作者Alex Krizhevsky,8层卷积神经网络。首次证明了学习到的特征可以超越手工设计的特征。

5.7 使用重复元素的网络(VVG)

VGG提出了可以通过重复使用简单的基础块来构建深度模型的思路。

5.8 网络中的网络(NiN)

NiN提出了另外一个思路,即串联多个由卷积层和“全连接”层构成的小网络来构建一个深网络。

5.9 含并行连结的网络(GoogLeNet)

GoogLeNet吸收了NiN中网络串联网络的思想,并在此基础上做了很大的改进。虽然名字含有LeNet,但是已经看不到LeNet的影子了,至少向LeNet致敬。

5.10 批量归一化

对全连接层做批量归一化:

对卷积层做批量归一化:

预测时的批量归一化:

5.11 残差网络(ResNet)

2015年,何凯明提出,

残差块:通过跨层的数据通道从而能够训练出有效的深度神经网络。

5.12 稠密连结网络(DenseNet)

稠密块:模块A直接跟模块B后面的所有层连结在了一起,会带来通道数的增加,会导致模型复杂,

过度块:用来控制模型的复杂度。

 

第6章 循环神经网络

6.1 语音模型

语言模型参数:

 

 

 

 

 

 

 

 

你可能感兴趣的:(读书笔记,深度学习)