欢迎订阅本专栏:《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