01 PyTorch模块类的构建方法
首先导入torch.nn
库,然后基于继承nn.Module
的方法构建深度学习模块。
整个模块的函数主要由两部分组成:
- 通过
__init__
方法初始化整个模型 forward
方法对该模型进行前向计算。
其中,在使用__init__
方法的时候,可以在类内部初始化子模块,然后在forward
方法中调用这些初始化的子模块,最后输出结果张量。
可以给类取任意的名字。
因为需要调用父类nn.Module
的初始化方法,这里需要使用super
函数来获取当前类的父类(即nn.Module
),然后调用父类的构造函数,从而初始化一些必要的变量和参数。
02 基于模块类的简单线性回归类
-
模型的初始化部分,
self.weight
和self.bias
是模型的参数,并且一开始被初始化,使得每个分量为标准正态分布(torch.randn
)。 -
线性回归的权重(
self.weight
)和偏置(self.bias
) -
forward
方法中,输入一个特征张量x (大小为迷你批次大小x特征维度大小),做线性变换(使用mm
方法做矩阵乘法进行线性变换),加偏置的值,最后输出一个预测的值。 -
另外,需要使用
nn.Parameter
来包装这些参数,使之成为子模块(仅仅由参数构成的子模块),这是因为在后续训练的时候需要对参数进行优化,只有将张量转换为参数才能在后续的优化过程中被优化器访问到。 -
在使用线性回归模型之前,首先要做的一件事是模型的初始化,初始化的任务由初始化模型的类实例开始。
假如输入的特征大小为n,可以直接调用LinearModel(n)来构造线性回归模型的一个实例。
如果需要预测 m × n m \times n m×n大小的张量对应的输出值,可以直接将 m × n m \times n m×n输入线性回归模型的实例中
- 下述代码前15行为线性回归模型示例;18~21行为模型的调用
import torch
import torch.nn as nn
class LinearModel(nn.Module):
def __init__(self, ndim):
super(LinearModel, self).__init__()
self.ndim = ndim
self.weight = nn.Parameter(torch.randn(ndim, 1)) #定义权重
self.bias = nn.Parameter(torch.randn(1)) #定义偏置
def forward(self, x):
#y=Wx+b
return x.mm(self.weight) + self.bias
lm = LinearModel(5) # 定义线性回归模型,特征数为5
x = torch.randn(4, 5) # 定义随机输入,迷你批次大小为4
y = lm(x) # 得到每个迷你批次的输出
print(y)