Dive into deep learning(04)[动手学深度学习]———————第四章 深度学习计算

文章目录

    • Dive into deep learning(04)[动手学深度学习]———————第四章,深度学习计算
        • 1、层和块(model-construction)
        • 2、参数管理(parameters)
        • 3、延后初始化(deferred-init)
        • 4、自定义层(custom-layer)
        • 5、读写文件(read-write)
        • 6、gpu(use-gpu)

Dive into deep learning(04)[动手学深度学习]———————第四章,深度学习计算

前言:论文初稿算是结束了。感觉自己效率还有待提高。

本章摘要: 这章主要是介绍怎么构造层,参数访问,怎么储存输入输出,怎么使用gpu等等基础内容。

1、层和块(model-construction)

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

作业:
作业都挺简单的,值得注意的是,dict相较于list的存储优势在于保存了序列。

函数记录:

chimera = nn.Sequential(NestMLP(), nn.Linear(16, 20), FixedHiddenMLP())##这个函数用来对层和块顺序连接

2、参数管理(parameters)

主要是怎么读取参数,类似于weight,bias这些。
还有参数初始化
作业:

函数记录:
net[2].state_dict()###读取网络中第三个模块的相关数据
net[2].bias##读取网络中第三个模块的偏置实例,注意是实例,包含了数据,梯度等信息
net[2].bias.data##读取网络中第三个模块的偏置数据
net[2].weight.grad##读取网络中第三个模块的权重梯度
print(*[(name, param.shape) for name, param in net.named_parameters()])##获取参数名字和形状
net.state_dict()['2.bias'].data##读取网络中第三个模块的偏置数据(另一种方式)
net.add_module(f'block {i}', block1())##可以实例化Sequential对象,通过add方法增加网络块。
net.apply(init_normal)##python内置函数,对net可迭代对象内的每个对象使用init_normal函数
nn.init.normal_(m.weight, mean=0, std=0.01)##对m块的权重设置为均值为0,方差为0.01
nn.init.zeros_(m.bias)##对m块的偏置设为0
nn.init.constant_(m.weight, 1)##对m块的权重都设置为1
nn.init.xavier_uniform_(m.weight)##对m的权重进行xv初始化
nn.init.uniform_(m.weight, -10, 10)##对m块的权重从-10到10均匀分布
m.weight.data *= m.weight.data.abs() >= 5##对绝对值大于5的数值保留,其余设置为0
shared = nn.Linear(8, 8) net = nn.Sequential(nn.Linear(4, 8), nn.ReLU(), shared, nn.ReLU(), shared, nn.ReLU(), nn.Linear(8, 1))###参数共享

3、延后初始化(deferred-init)

相关的api还不成熟
延后初始化使框架能够自动推断参数形状,使修改模型架构变得容易,避免了一些常见的错误。
我们可以通过模型传递数据,使框架最终初始化参数。
作业:

函数记录:
nn.LazyLinear(256) #如果传入n维数据,最后会变成256维
``

4、自定义层(custom-layer)

我们可以通过基本层类设计自定义层。这允许我们定义灵活的新层,其行为与深度学习框架中的任何现有层不同。
在自定义层定义完成后,我们就可以在任意环境和网络架构中调用该自定义层。
层可以有局部参数,这些参数可以通过内置函数创建。
作业:

函数记录:

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)

5、读写文件(read-write)

主要是怎么存储和读取模型,需要注意的是torch只存储权重数据,不会存储模型架构。即当要使用模型时,不仅要读取权重,还要把读取到的权重覆盖到模型上去。
作业:

函数记录:
torch.save(net.state_dict(), 'mlp.params')##存储模型的权重
clone.load_state_dict(torch.load('mlp.params'))##加载本地数据,使用到clone这个模型
``

6、gpu(use-gpu)

主要是gpu的使用。可以在不同GPU上保存不同的数据,但是两者不互通。
我们可以指定用于存储和计算的设备,例如CPU或GPU。默认情况下,数据在主内存中创建,然后使用CPU进行计算。
深度学习框架要求计算的所有输入数据都在同一设备上,无论是CPU还是GPU。
不经意地移动数据可能会显著降低性能。一个典型的错误如下:计算GPU上每个小批量的损失,并在命令行中将其报告给用户(或将其记录在NumPy ndarray中)时,将触发全局解释器锁,从而使所有GPU阻塞。最好是为GPU内部的日志分配内存,并且只移动较大的日志。
作业:
第2题 我们应该如何在GPU上读写模型参数?
emmmm,我觉得可以gpu转cpu存储再进行读写。
函数记录:

你可能感兴趣的:(深度学习,python,人工智能)