PyTorch定义模型结构的常用方法

定义模型的几个步骤:

        1.定义模型类,使其继承于Module类;

        2.在模型类的初始化接口中定义网络层;

        3.在模型类的正向数据流处理接口中,将网络层连接起来并添加激活函数。

Module类的使用方法

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参数)

模型与参数的关系

# 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)

L2正则化接口

# 添加正则化处理
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)

Dropout接口

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,则系统将跟踪每批次输入的数据,并实时更新整个数据集的均
# 值和方差
    

你可能感兴趣的:(#,pytorch编程基础,神经网络,人工智能,深度学习)