PytorchLearning-linerRegression

PytorchLearning-linearRegression

标签: DeepLearning Pytorch


概述

  今天学习了pytorch中的Tensor和autograd两个概念,并利用autograd实现了一个简单的线性回归模型。

基础概念

Tensor

  Tensor是Pytorch中的张量系统。这个概念在几个深度学习框架中都出现过。Tensor和numpy中的ndarrays类似,但是pytouch中的Tensor支持GPU加速。
  Tensor的接口设计与numpy类似,用法主要分为创建,索引,逐元素操作,统计归并,比较等方法,详细的使用可以参考Pytorch的官方文档。

autograd

  autograd是pytorch中的自动微分系统,其核心数据结构是Variable。Variable封装了tensor,并记录对tensor的操作记录用来构建计算图。Variable的数据结构包括三个属性:data,gard,gard_fn。
  Variable的构造函数需要传入tensor,并支持大部分tensor支持的函数。

线性回归

  线性回归利用了数理统计中的回归分析来确定两种或两种以上变量间相互依赖的定量关系,其表达形式为:
                       Markdown
  损失函数为:
                  Markdown
  利用梯度下降方法更新参数w和b来最小化损失函数,训练得到w和b的数值。

回归实现

代码实现

  本次数据集为y(x)=3*3+3函数随机化处理后的样本点.
  实现代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import torch as t
from numpy import *
from torch.autograd import Variable as V
from matplotlib import pyplot as plt
from IPython import display

# get the fake date
t.manual_seed(1000)

def get_fake_data(batch_size = 8):
x = t.rand(batch_size,1)*20
y = x*3+(1+t.randn(batch_size,1))*2
return x,y


# Parameter initialization
w = V(t.rand(1,1),requires_grad=True)
b = V(t.zeros(1,1),requires_grad=True)

# learning rate
lr = 0.001

for i in range(8000):
x,y = get_fake_data()
x,y = V(x),V(y)

#forward
y_pred = x.mm(w) + b.expand_as(y)
loss = 0.5*(y_pred - y)**2
loss = loss.sum()

#backward
loss.backward()

#renew the initialization
w.data.sub_(lr * w.grad.data)
b.data.sub_(lr * b.grad.data)

#Zero gradient
w.grad.data.zero_()
b.grad.data.zero_()

if i%2000 == 0:
display.clear_output(wait = True)
x1 = t.linspace(0,20).view(-1,1)
y1 = x1.mm(w.data) + b.data.expand_as(x1)
plt.plot(x1.numpy(),y1.numpy())

x2,y2 = get_fake_data(batch_size = 20)
plt.scatter(x2.numpy(),y2.numpy())

plt.xlim(0,20)
plt.ylim(0,41)
plt.show()
plt.pause(0.5)

print(w.data.squeeze()[0],b.data.squeeze()[0])

  训练结果如下:
  迭代2000次结果如下:
Markdown
  迭代8000次结果如下:
Markdown
  可以发现参数b学习结果比较明显。

遇到的问题

  在实现代码的过程中,我引用了torch中的arange构造自变量x1,但是提示报错:

1
2
3
4
5
$ python linearRegression.py 
Traceback (most recent call last):
File "linearRegression.py", line 45, in <module>
x1 = t.arange(0,20).view(-1,1)
AttributeError: 'module' object has no attribute 'arange'

  我一开始还以为是torch和numpy版本不匹配的问题,先做了一个测试,发现arange不可用,但是linspace可用

1
2
3
4
5
6
7
8
9
10
11
>>> import torch as t
>>> t.arange(1,6,3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'arange'
>>> t.linspace(1,6,3)

1.0000
3.5000
6.0000
[torch.FloatTensor of size 3]

  所以在代码中先使用linspace,后正常运行。