import torch
import torch.nn as nn
创建一个简单的神经网络
net = nn.Sequential(nn.Linear(2,2), nn.Linear(2,3)) # 2*2 --> 2*3
net
Sequential(
(0): Linear(in_features=2, out_features=2, bias=True)
(1): Linear(in_features=2, out_features=3, bias=True)
)
获取神经网络中的各层参数
net[0].weight, net[1].weight # net的索引值表示神经网络对应的层数
(Parameter containing:
tensor([[-0.5032, -0.3683],
[-0.0747, 0.5652]], requires_grad=True),
Parameter containing:
tensor([[-0.5802, -0.6611],
[-0.3477, 0.5131],
[-0.0838, 0.4044]], requires_grad=True))
根据输出的结果可以看出,神经网络的参数类型为Tensor
(张量)
第一种赋初值的方式
既然是张量,就可以使用张量的各种接口对data
的值进行改变
net[0].weight.fill_(1) # 这里会报错
---------------------------------------------------------------------------
RuntimeError: a leaf Variable that requires grad is being used in an in-place operation.
上面的输出报错,这是因为神经网络创建时,我们默认了requires_grad=True
,这表示自动求导机制会一直追踪网络中各层的parameters
的值,而直接改变值操作是无法求导的,故torch
包不允许这样做。为了解决这个问题,要将这一步改值操作放在不追踪梯度的代码区域中
with torch.no_grad(): # autograd不追踪下面的改值操作
net[0].weight.fill_(1)
net[0].bias.fill_(2)
net[0].weight, net[0].bias
(Parameter containing:
tensor([[1., 1.],
[1., 1.]], requires_grad=True),
Parameter containing:
tensor([2., 2.], requires_grad=True))
可以看出第一层的parameters
的值改变了
第二种赋初值的方式
通过函数进行赋值,这里的好处是赋值清晰明了可以一次性将网络中的多个层赋值并且不用写with torch.no_grad():
将net
的赋值接口与我们创建的函数对接,之后,每一层都将传递给init_parameters
函数,函数中的m
参数即为每一层的引用
def init_parameters(m):
if type(m) == nn.Linear:
nn.init.normal_(m.weight) # 以正态分布的数据来更改m.weight
nn.init.ones_(m.bias)
net.apply(init_parameters)
Sequential(
(0): Linear(in_features=2, out_features=2, bias=True)
(1): Linear(in_features=2, out_features=3, bias=True)
)
net.parameters()
是神经网络的参数生成器,会依次获取各层参数(类型为tensor
)
net.parameters()
<generator object Module.parameters at 0x000001B99585D580>
para_iter = iter(net.parameters())
print('第一层的weight&bias:')
print(next(para_iter)) # 第一层的weitght参数
print(next(para_iter)) # 第一层的bias参数
print('第二层的weight&bias:')
print(next(para_iter)) # 第二层的weight参数
print(next(para_iter)) # 第二层的bias参数
第一层的weight&bias:
Parameter containing:
tensor([[ 0.0447, 0.2172],
[-0.9527, 0.8798]], requires_grad=True)
Parameter containing:
tensor([1., 1.], requires_grad=True)
第二层的weight&bias:
Parameter containing:
tensor([[-0.0231, 0.0765],
[ 1.5604, -1.1159],
[ 1.9803, 1.1268]], requires_grad=True)
Parameter containing:
tensor([1., 1., 1.], requires_grad=True)