16 PyTorch 神经网络基础【动手学深度学习v2】

神经网络基础
层和块

net规定了网络形状,由一个(20,256)和(256,10)的全连接网络和夹在其中的ReLU激活函数构成
X为初始参数,包含两个样本,每个样本中有20维度。
下图:用Pytorch中的Moudle构造神经网络


Sequential函数构建神经网络(同样继承自moudle父类):

其他更灵活的定义网络的方法:
(torch.mm是指矩阵乘法)
下图所示前馈方法并没有实际意义,只是为了说明定义网络的灵活性。

网络层之间的嵌套(网络计算顺序是Sequential函数括号内部由左到右):

参数管理

net可以视为python里的list类别,可以通过序号对其内容进行访问。
此处使用state_dict对net中的第三层进行访问,输出其状态(对于感知机来说,其状态等于其所含参数:weigh和bias)

可以访问层中的具体参数。每个层中的w,b各含两个元素:data(记录该元素具体值)和grad(记录该元素梯度值,在未进行梯度计算时,显示None)

一次性访问网络中所有参数

“*” :解包作用


网络有嵌套时的情形:
block1:简单的全连接层
block2:含有四个block1的网络
rgnet:block2+ReLU

rgnet结构
(bias值为True时,表示会为线性层添加偏置项)

设置初始参数
init_normal:初始化为正态分布
init_constant:初始化为常数(不推荐)

net.apply(init_normal)
在net中各层套用init_normal


对不同的块使用不同的数据初始化:
Xavier初始化:详见李沐Pytorch笔记14
此处对第一层应用Xavier初始化,对第三层应用常数初始化

自定义初始化:保留绝对值大于5的权重,其他权重置0.

直接修改法

权重共享:
指定网络中第二层和第三层权重保持一致(此处激活层不算在层数中)

自定义层
以下代码定义了一个无参数层,能够将输入数据的平均值变为0


以下代码通过自定义构建一个线性全连接层,需要的参数有输入维度和输出维度。计算所用的w与b在函数内部按正态分布生成。

使用例

读写文件

torch.save(x, 'x-file')
将x值存储在当前目录下的 x-file中
以下程序演示存储了list

以下程序演示存储了模型参数

通过储存state_dict储存模型信息

使用这个被储存的模型时,要先将新的模型也定义为与被储存模型相同的结构(clone=MLP())然后进行应用

eval():开始训练,此处功能应该类似于train()
补充知识:
Sequential默认kaiming初始化,该方法在未来会有涉及