动手学习深度学习(8)深度学习计算
在本章中,我们将深入探索深度学习计算的关键组件, 即模型构建、参数访问与初始化、设计自定义层和块、将模型读写到磁盘, 以及利用GPU实现显著的加速。 这些知识将使你从深度学习“基础用户”变为“高级用户”。
层和块
事实证明,研究讨论“比单个层大”但“比整个模型小”的组件更有价值。为了实现这些复杂的网络,我们引入了神经网络块的概念。 块(block)可以描述单个层、由多个层组成的组件或整个模型本身。
自定义块:
1 |
|
顺序块:
1 |
|
参数管理
之前的介绍中,我们只依靠深度学习框架来完成训练的工作, 而忽略了操作参数的具体细节。
层
首先关注具有单隐藏层的多层感知机
1 |
|
每层的参数都在其属性中。如下所示,我们可以检查第二个全连接层的参数。
1 |
|
从结果可以看出:首先,这个全连接层包含两个参数,分别是该层的权重和偏置。 两者都存储为单精度浮点数(float32)。 注意,参数名称允许唯一标识每个参数,即使在包含数百个层的网络中也是如此。
也可以查看每一层具体的参数
1 |
|
块
从嵌套块收集参数
1 |
|
查看信息
1 |
|
因为层是分层嵌套的,所以我们也可以像通过嵌套列表索引一样访问它们。 下面,我们访问第一个主要的块中、第二个子块的第一层的偏置项。
1 |
|
参数初始化
默认情况下,PyTorch会根据一个范围均匀地初始化权重和偏置矩阵, 这个范围是根据输入和输出维度计算出的。 PyTorch的nn.init
模块提供了多种预置初始化方法。
1 |
|
上面自定义初始化遵循以下分布
MATHJAX-SSR-38
1 |
|
参数绑定
有时我们希望在多个层间共享参数: 我们可以定义一个稠密层,然后使用它的参数来设置另一个层的参数。
1 |
|
你可能会思考:当参数绑定时,梯度会发生什么情况? 答案是由于模型参数包含梯度,因此在反向传播期间第二个隐藏层 (即第三个神经网络层)和第三个隐藏层(即第五个神经网络层)的梯度会加在一起。
自定义层
构造一个没有任何参数的自定义层
1 |
|
读写文件
加载和保存张量:
1 |
|
- Title: 动手学习深度学习(8)深度学习计算
- Author: 茴香豆
- Created at : 2022-10-29 22:16:41
- Updated at : 2022-10-30 15:11:05
- Link: https://hxiangdou.github.io/2022/10/29/DL_8/
- License: This work is licensed under CC BY-NC-SA 4.0.