import torch
from torch import nn
from torch. nn import init
net = nn. Sequential( nn. Linear( 4 , 3 ) , nn. ReLU( ) , nn. Linear( 3 , 1 ) )
print ( net)
X = torch. rand( 2 , 4 )
Y = net( X) . sum ( )
for param in net. parameters( ) :
print ( param. grad, "net有四个模型参数" )
'''
-------------------------访问模型参数
对于Sequential实例中含有模型参数的层,可以通过Module类的parameters()方法来访问所有参数(通过迭代器型形式返回)
'''
print ( type ( net. named_parameters( ) ) )
for name, param in net. named_parameters( ) :
print ( name, param. size( ) )
for name, param in net[ 0 ] . named_parameters( ) :
print ( name, param. size( ) , type ( param) )
class MyModel ( nn. Module) :
def __init__ ( self) :
super ( MyModel, self) . __init__( )
self. weight1 = nn. Parameter( torch. rand( 20 , 20 ) )
self. weight2 = torch. rand( 20 , 20 )
def forward ( self, x) :
pass
n = MyModel( )
for name, param in n. named_parameters( ) :
print ( name)
weight_0 = list ( net[ 0 ] . parameters( ) ) [ 0 ]
print ( weight_0. data)
Y. backward( )
print ( weight_0. grad)
'''
-------------------------------------------初始化模型参数
不同类型的layer具体采用的哪一种初始化方法是不一样的
'''
for name, param in net. named_parameters( ) :
if 'weight' in name:
init. normal_( param, mean= 0 , std= 0.01 )
print ( name, param. data)
for name, param in net. named_parameters( ) :
if 'bias' in name:
init. constant_( param, val= 0 )
print ( name, param. data)
'''
---------------------------------自定义初始化方法
当我们想要的初始化方法没有函数提供时,需要自己实现一个初始化方法
'''
def normal_ ( tensor, mean= 0 , std= 1 ) :
with torch. no_grad( ) :
return tensor. normal_( mean, std)
def init_weight_ ( tensor) :
with torch. no_grad( ) :
tensor. uniform_( - 10 , 10 )
tensor *= ( tensor. abs ( ) >= 5 ) . float ( )
for name, param in net. named_parameters( ) :
if 'weight' in name:
init_weight_( param)
print ( name, param. data)
for name, param in net. named_parameters( ) :
if 'bias' in name:
param. data += 1
print ( name, param. data)
'''
------------------------------------------------共享模型参数
在多个层之间共享模型参数
Module类中的forward函数里多次调用同一个层可以实现多层共享模型参数
除此之外,如果传入Sequential的模块是同一个Module实例也可以共享
'''
linear = nn. Linear( 1 , 1 , bias= False )
net = nn. Sequential( linear, linear)
print ( net)
for name, param in net. named_parameters( ) :
init. constant_( param, val= 3 )
print ( name, param. data)
'''
--------------------所以模型参数共享不共享,可以看是否是nn.Linear(a,b)这种实例化是否是同一个,
比如上面的就是同一个实例化对象
'''
x = torch. ones( 1 , 1 )
y = net( x) . sum ( )
print ( y)
y. backward( )
print ( net[ 0 ] . weight. grad)