线性模型形式简单,易于建模,具有很好的解释性质。

基本概念

线性模型试图学到一个通过属性的线性组合来进行预测的函数,线性模型将要学到下面的一个函数形式:
$$
f(x) = \omega^T x + b
$$
简单的来说,即通过训练数据 (x,y) 来学的线性模型的$\omega$ 和b,即可确定模型。

线性模型 pytorch实现

在实现一个线性模型之前,我们首先确定一下算法实现的pipeline。

  • 数据准备:训练数据,label,以及测试数据的格式与读取形式。
  • 模型的建立:模型类继承torch.nn.Module,实现其中的__init__(),forward()函数。
  • 确定网络的criterion以及optimizer。
  • 训练过程:每过一个step进行参数的更新。

数据准备部分

在这个例子中,我们使用较为简单的数据作为输入:

1
2
3
4
import torch
from torch.autograd import Variable
x_data = Variable(torch.Tensor([[1.0],[2.0],[3.0]]))
y_data = Variable(torch.Tensor([[2.0],[4.0],[6.0]]))

Vari3able 变量于Tensor的区别在于variable变量是可以计算梯度的,在梯度反向传播的时候进行梯度的计算。

模型的建立

pytorch中模型类均需要继承一个父函数:torch.nn.Module.

torch.nn.module 是所有网络的基类,我们定义的网络类,都需要继承自这个类。torch.nn这个类中包含各种网络层结构,linear,conv等等。对于我们的线性模型来说,我们可以定义一个网络类,然后在init中定义linear。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class LinearRegressionModel(torch.nn.Module):
"""
定义自己的网络需要继承torch.nn.Module类,实现其中的init以及forward方法:
torch.nn.Module:
torch.nn是专门为神经网络设计的模块化接口。nn构建于autograd之上,可以用来定义和运行神经网络
nn.Module是nn中十分重要的类,包含网络各层的定义及forward方法。
一般把网络中具有可学习参数的层放在构造函数__init__()中
"""
def __init__(self):
super(LinearRegressionModel,self).__init__()
"""
线性模型:torch.nn.Linear(in_features,out_features,bias=True)
"""
self.linear = torch.nn.Linear(1,1) # one in one out
def forward(self,x):
y_pred = self.linear(x)
return y_pred

criterion and optimizer

Criterion 即为网络训练过程中,输出的预测值与groundTruth之间的差距,通常在二分类问题上可以使用MSE loss,crossentropy等等。如torch.nn.MSELoss()

Optimizer 可以使用torch.optim.SGD(linear_model.parameters(),lr = 0.01)

train

网络训练过程中,设置训练的次数,首先将数据传如入网络中,然后使用criterion求出输出与groundtruth之间的偏差。在每一次参数更新时,首先将梯度置零,然后进行梯度的向后传播。

1
2
3
4
5
6
7
for epoch in range(500):
pre = linear_model(x_data)
loss = criterion(pre,label)
# 清空参数
optimizer.zero_grad()
loss.backgrad() # 参数向后传播
optimzer.step()

evaluate

网络测试部分比较简单,将输入输入网络中,得到其输出。

1
2
result = linear_model(new_var)
print('result {}'.format(result.data[0]))