第十八篇—模型参数的访问、初始化和共享
2023-02-16 16:25 作者:YouOnly_LiveOnce | 我要投稿
部分一:模型参数的访问
通过Module类的parameters()或named_parameters()方法访问模型参数;
代码实现:
打印结果:

可以发现,named_parameters()方法是通过生成器来访问模型参数的,关于生成器generator可参考算法岗面试总结—Python篇;对于通过Sequential类构造的网络,可以进行单层的访问:
结果:

注意:
Parameter类是Tensor类的子类,如果一个Tensor是Parameter,则会被自动添加到模型的参数列表:
因为Parameter类是Tensor的子类,所以可由data访问参数值,由grad访问梯度:
结果:

部分二:模型参数的初始化
例如,将权重参数初始化成均值为0,标准差为0.01的正态分布随机数,偏差参数清零:
结果:

自定义初始化方法:使权重有一半的概率初始化为0,有另一半的概率初始化为[-10,-5]和[5,10]两个区间里均匀分布的随机数,代码实现如下;
结果:

我们可以通过data来改写模型的参数值,而不影响梯度:
结果:

部分三:模型参数的共享
如果Sequential里是同一个Module实例,则这些Module实例的参数共享,代码实现如下:
结果:

实际上,在内存中,这两个Module实例其实是同一个对象:
模型参数里包含了梯度,所以在反向传播计算时,共享的参数的梯度会进行累加:
结果:
