1.定义模型类,使其继承于Module类;
2.在模型类的初始化接口中定义网络层;
3.在模型类的正向数据流处理接口中,将网络层连接起来并添加激活函数。
Module类的add_module()方法
import torch.nn as nn
# 继承nn.Module类,构建网络模型
class LogicNet(nn.Module):
def __init__(self, inputdim, hiddendim, outputdim): # 初始化网络结构
super(LogicNet, self).__init__()
# self.Linear1 = nn.Linear(inputdim,hiddendim) #定义全连接层
# self.Linear2 = nn.Linear(hiddendim,outputdim)#定义全连接层
self.add_module("Linear1", nn.Linear(inputdim, hiddendim)) # 定义全连接层
self.add_module("Linear2", nn.Linear(hiddendim, outputdim)) # 定义全连接层
self.criterion = nn.CrossEntropyLoss() # 定义交叉熵函数
def forward(self, x): # 搭建用两层全连接组成的网络模型
x = self.Linear1(x) # 将输入数据传入第1层
x = torch.tanh(x) # 对第一层的结果进行非线性变换
x = self.Linear2(x) # 再将数据传入第2层
return x
Module类的children()方法
# 通过children()方法来获取各层的信息
model = LogicNet(inputdim=2, hiddendim=3, outputdim=2) # 初始化模型
optimizer = torch.optim.Adam(model.parameters(), lr=0.01) # 定义优化器
# model = model.cuda()
for sub_module in model.children():
print(sub_module)
输出结果:
Module类的named_children()方法
for name, module in model.named_children():
print(name, "is:", module)
# 输出结果
# Linear1 is: Linear(in_features=2, out_features=3, bias=True)
# Linear2 is: Linear(in_features=3, out_features=2, bias=True)
# criterion is: CrossEntropyLoss()
Module类的modules()方法
# 通过modules()获取网络中的结构信息
for module in model.modules():
print(module)
# 输出信息
# LogicNet(
# (Linear1): Linear(in_features=2, out_features=3, bias=True)
# (Linear2): Linear(in_features=3, out_features=2, bias=True)
# (criterion): CrossEntropyLoss()
# )
# Linear(in_features=2, out_features=3, bias=True)
# Linear(in_features=3, out_features=2, bias=True)
# CrossEntropyLoss()
模型与参数的关系
# Parameters是Variable的子类,代表模型参数,是模型的重要组成部分之一。
Parameter和Variable的区别
# 在将Parameter变量赋值到Module属性时,Parameter变量会被自动添加到Module的列表中
# 在将Variable 变量赋值到Module属性时,Variable变量不会被加到Module列表中
向模型中添加参数
# name表示参数名称,param表示可以被添加到模块中的参数
torch.nn.Module.register_parameter(name, param)
为模型添加状态参数
# 向模型中添加缓冲区
torch.nn.Module.register_buffer(name, tensor, persistent=True)
用parameter()方法获取模型的参数
# model是神经网络类的实例
for param in model.parameters():
print(type(param.data), param.size())
用named_parameters()参数获取模型的参数和参数名字
for name, param in model.named_parameters():
print(type(param.data), param.size(), name)
用state_dict()方法获取模型的全部参数
for par in model.state_dict():
print(par,':',model.state_dict()[par])
为模型的参数指定名称并查看权重
model = nn.Sequential(OrderDict([
('conv1', nn.Conv2d(1,20,5)),
('relu1', nn.ReLU()),
('conv2', nn.Conv2d(20,64,5)),
('relu2', nn.ReLU()),
]))
print(model) # 打印网络结构
# 以类成员的形式使用
# 在模型类的init()方法中定义激活函数
self.tanh = torch.nn.Tanh()
# 然后在模型类的forward()中添加激活函数的应用
output = self.tanh(input)
# 以临时类对象的形式使用
output = torch.nn.Tanh()(input)
# 以函数的形式使用
output = torch.nn.functional.tanh(input)
# 添加正则化处理
weight_p, bias_p = [], []
for name, p in model.named_parameters():
if 'bias' in name:
bias_p += [p]
else:
weight_p += [p]
optimizer = torch.optim.Adam([{'params': weight_p, 'weight_decay': 0.001},
{'params': bias_p, 'weight_decay': 0}],
lr=0.01)
torch.nn.functional.dropout(input, p=0.5, training=False, inplace=False)
# input:输入值
# p:丢弃率,默认值为0.5
# training:该函数的当前使用状态,默认为False,表示不在训状态使用,这时不丢弃任何节点
# inplace:是否改变输入值,默认不改变
# BatchNorm1d:对2维或者3维的数据进行BN处理,输入形状是[N,D]或者[N,D,L](N代表批次数,D代表数
# 据的个数,L代表数据的长度)
# BatchNorm2d:对2维数据进行BN处理,输入形状是[N,C,H,W](N代表批次数,C代表通道数,H代表高度,
# W达标宽度)
# BatchNorm3d:对3维数据进行BN处理,输入形状是[N,C,D,H,W](N代表批次数,C代表通道数,D代表深度,
# H代表高度,W达标宽度)
# 例子如下:
torch.nn.BatchNorm1d(num_features,eps=1e-05,momentum=0.1,affine=True,track_running_stats=True)
# num_features:输入数据的特征数,如果输入数据的形状是[N,D](N代表批次数,D代表数据的个数),该
# 值为D
# eps:默认为1e-5,为了保证分母不为0,给分母加上eps数值,默认为1e-5
# momentum:动态均值和动态方差所使用的动量,默认值为1
# affine:是否使用自适应模型
# track_running_stats:是否跟踪当前批次数据的统计特性。在训练过程中,如果是False,则系统只使用
# 当前批次数据的均值和方差;如果是True,则系统将跟踪每批次输入的数据,并实时更新整个数据集的均
# 值和方差