nn.Linear()
,nn.ReLU()
都是一个层nn.Squential()
将层按照顺序串联起来。块可以包含代码。import torch
from torch import nn
net = nn.Sequential(nn.Linear(4, 8), nn.ReLU(), nn.Linear(8, 1), nn.ReLU())
net.state_dict()
# output
OrderedDict([('0.weight',
tensor([[-0.0496, -0.0753, 0.2943, -0.4262],
[ 0.2756, -0.0456, -0.2515, -0.0638],
[-0.3028, -0.4963, -0.0655, 0.4014],
[-0.0471, -0.3199, 0.1669, 0.4105],
[-0.3673, 0.0115, 0.3379, -0.3550],
[-0.3813, 0.4021, -0.4041, -0.3988],
[ 0.3006, 0.0657, 0.1426, 0.3859],
[-0.4356, -0.2792, 0.1333, 0.2652]])),
('0.bias',
tensor([-0.4544, 0.1838, -0.0748, 0.4512, 0.1050, 0.2546, 0.0034, 0.1392])),
('2.weight',
tensor([[ 0.2673, -0.1137, 0.1411, 0.2245, 0.0517, 0.2765, -0.0941, 0.2959]])),
('2.bias', tensor([-0.0631]))])
这里的没有指定要访问那一层,所以以字典的形式全部打印出来。这里的
0.weight
和0.bias
代表的是第0
层的weight
和bias
参数,因为nn.ReLU()
没有参数。所以无法打印出来,但是不能忽略其为一层,所以下一个全连接层按照其顺序的第二个顺序定义。
net[2].state_dict()
# output
OrderedDict([('weight', tensor([[-0.0578, 0.2847, 0.0501, -0.1246, 0.2490, -0.0303, ,→ 0.1356, 0.2373]])), ('bias', tensor([0.1629]))])
其输出包括有哪几种参数,比如全连接层(nn.Linear()
)有权重(weight
)和偏置(bias
)两类参数
net[2].bias:属于Parameter类
其不仅包括bias的数值,还有其他一些信息,如是否要进行梯度计算的标识符require_grad和梯度grad
其数值可以通过 net[2].bias.data访问
其梯度可以通过net[2].bias.grad访问
torch.save(x, 'file_path')
x = torch.load('file_path')
# 只保存参数
torch.save(net.state_dict(), 'net.params')
# 加载
net_instance = net()
net_instance.load_state_dict(torch.load('net.params'))
net_instance.eval()