5 PyTorch构建模型的三种方式

本文详细介绍了如何使用PyTorch的nn.Module、nn.Sequential以及自定义nn.Module子类来构建神经网络模型。通过线性回归模型实例,演示了模型的创建、参数获取及前向计算,包括单个样本和批量样本的处理。此外,还讨论了如何组合子模块、命名子模块以及通过不同方式获取模型参数。
摘要由CSDN通过智能技术生成

欢迎订阅本专栏:《PyTorch深度学习实践》
订阅地址:https://blog.csdn.net/sinat_33761963/category_9720080.html

  • 第二章:认识Tensor的类型、创建、存储、api等,打好Tensor的基础,是进行PyTorch深度学习实践的重中之重的基础。
  • 第三章:学习PyTorch如何读入各种外部数据
  • 第四章:利用PyTorch从头到尾创建、训练、评估一个模型,理解与熟悉PyTorch实现模型的每个步骤,用到的模块与方法。
  • 第五章:学习如何利用PyTorch提供的3种方法去创建各种模型结构。
  • 第六章:利用PyTorch实现简单与经典的模型全过程:简单二分类、手写字体识别、词向量的实现、自编码器实现。
  • 第七章:利用PyTorch实现复杂模型:翻译机(nlp领域)、生成对抗网络(GAN)、强化学习(RL)、风格迁移(cv领域)。
  • 第八章:PyTorch的其他高级用法:模型在不同框架之间的迁移、可视化、多个GPU并行计算。

pytorch在torch.nn提供了神经网络模型的所有子模块.这些子模块包含了构建神经网络的块,这些块在pytorch中称为module(你可能会在其他深度学习框架中发现被称为layer,其实是一个东东)。

也就是说神经网络完整模型其实是由一个一个module组成的。但我们想构建一个自己的模型的时候,只需要调取对应的module,像搭积木一样搭成自己想要的模型结构即可。

所有的moduel都是一个python类,都是继承自nn.Module这个父类的。一个Module类有两类基本属性:

  • Parameter instatance, 即moduel中有一个或多个参数实例,这些tensor形式的参数是模型的灵魂,在数据上训练模型就是为了估计这些参数的值,从而也就有了模型本身。比如线性回归中的w和b
  • submodule (sub class of nn.Module), 即子模块,这些子模块的组合才成就了整个大模块。

本章结构

本章讲介绍如何利用pytorch提供的模型组件来构造自己想要的模型。分别由三小节:

  • 第一节:介绍利用nn.Module构建单一模型与获取参数
  • 第二节:介绍利用nn.Sequence构建略复杂的需要组合组件的模型于获取参数
  • 第三节:介绍利用nn.Module的subclass构建更复杂的模型与获取参数

5.1 利用nn.Module构建线性回归模型

nn.Module里有一个子模块叫做nn.Linear,顾名思义,它进行的是wb+b的线性计算。

5.1.1 构建模型

还记得第四章我们是如何建立线性模型的吗,我们写了一个函数:

def model(x, w, b):
    return w*x + b

现在我们用nn.Linear去代替这个自己撰写函数

import torch.nn as nn

linear_model = nn.Linear(1,1)

nn.Linear(1,1)构建了一个一元线性回归模型结构实例,第一个参数代表输入的特征数,第二个参数代表输出的个数,因为是一元回归,所有输入是1,输出也是1。同时,已经在该实例内部初始化了模型需要的参数w,b,无需自己创建于初始化,可以如下查看参数:

linear_model.weight
Parameter containing:
tensor([[-0.6442]], requires_grad=True)
linear_model.bias
Parameter containing:
tensor([0.1683], requires_grad=True)
linear_model.parameters()
list(linear_model.parameters())
[Parameter containing:
 tensor([[-0.6442]], requires_grad=True), Parameter containing:
 tensor([0.1683], requires_grad=True)]

5.1.2 单个样本前向计算

构建好了模型,就可以拿去做前向计算了:

import torch

x = torch.tensor([0.5])

# 前向计算
y = linear_model(x)
print(y)

tensor([-0.1538], grad_fn=<ThAddBackward>)

以上,调用模型实例linear_model输入参数x,其实是调用了nn.Linear类中的方法forward(),模型的前向计算过程会全部写在forward方法中。

5.1.3 批量样本前向计算

nn中的所有module都是可以同时输入批量多元的input,并输出批量多元的output的。比如你想一次性处理10个样本,你只需将数据处理成Bn_in大小的tensor一次性喂给模型,它会输出Bn_out的大小的tensor,其中B是批量数据的数量,n_in是输入特征的数目,n_out是输出特征的数目。比如:

# 生成10个样本,输入特征数为1
x = torch.ones(10,1)
print(x)

y = linear_model(x)
print(y)
tensor([[1.],
        [1.],
        [1.],
        [1.],
        [1.],
        [1.],
        [1.],
        [1.],
        [1.],
        [1.]])
tensor([[-0.4758],
        [-0.4758],
        [-0.4758],
        [-0.4758],
        [-0.4758],
        [-0.4758],
        [-0.4758],
        [-0.4758],
        [-0.4758],
        [-0.4758]], grad_fn=<ThAddmmBackward>)

注意B个数据的大小应为B*n_in,是两维的tensor, 还记得第四章的老例子吗,x和y的tensor大小是一维的,需要做如下转换:
.unsqueeze(1)指axis=1处额外增加一个维度

x = [0.5, 14.0, 15.0, 28.0, 11.0, 8.0, 3.0, -4.0, 6.0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值