基于pytorch的linear regression的学习

首先第一步是产生训练的数据,这里我们采用scikit工具箱来完成。

import numpy as np

import matplotlib.pyplot as plt

from sklearn.datasets.samples_generator import make_regression

import torch

import torch.nn as nn

from torch.autograd import Variable

# n_samples表示样本数量, n_features表示输入参数个数, noise代表噪声, coef选择是否输出系数

# 当n_features = 1 时,可以进行可视化

X, y, coef =make_regression(n_samples=1000, n_features=1,noise=10, coef=True)

​

plt.scatter(X, y,  color='green')

plt.plot(X, X*coef, color='red',linewidth=3)

​

plt.xticks(())

plt.yticks(())

​

plt.show()

print(coef)

print(np.shape(X))

print(np.shape(y))

输出结果:

56.506029105169716
(1000, 1)
(1000,)

下一步是建立一个模型

# 首先将数据转换成tensor变量 #上面的make_regression产生的是double型数据, 直接导入到tensor里面会跑不通, 这里把它们转成float32型的变量

X = X.astype('float32')

y = y.astype('float32')

​

print(np.size(X))

print(np.shape(X))

print(np.shape(y))

​

# 下面的这一步非常的关键, pytorch里面只支持(n, 1)这种类型的matric,而不支持这种(n,)类似的scaler或vector类型的变量

y = np.reshape(y, (np.size(X),1))

​

train_x = torch.from_numpy(X)

train_y = torch.from_numpy(y)

​

# 再定义一个模型,一般用类的形式来产生

# 这里的nn.Module是被继承了,nn.Module里面包含了很多需要的模块 

class linear_regression(nn.Module):

    """

     linear regression module

    """

    def __init__(self):

        super(linear_regression, self).__init__()

        # Linear函数只有一个输入一个输出

        self.linear = nn.Linear(1, 1)



    def forward(self, x):

        out = self.linear(x)

        return out



model = linear_regression()

print(model)

print(train_x.size())

print(train_y.size())

print(type(train_x))

输出结果:

1000
(1000, 1)
(1000, 1)
linear_regression (
  (linear): Linear (1 -> 1)
)
torch.Size([1000, 1])
torch.Size([1000, 1])
<class 'torch.FloatTensor'>

接着对模型的未知参数进行求解

# 紧接着需要定义loss和optimize了

# 利用最小二乘来定义损失

learning_rate = 1e-3   # 学习率

criterion = nn.MSELoss()

optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)

# SGD的第一参数传入的是模型要优化的参数, 第二个表示的是学习率# 开始训练

num_epoch = 100

​

for epoch in range(num_epoch):



    # 将数据转换成tensor变量,这样可以自动求导

    inputs = Variable(train_x)

    targets = Variable(train_y)





    # 前向 + 后向 + 优化

    optimizer.zero_grad()

    outputs = model(inputs)

    loss = criterion(outputs, targets)

    loss.backward()

    optimizer.step()



    if epoch % 20 == 0:

        print(" current loss is %.5f" % loss.data[0])


只要learning_rate选得好,这里基本上一步就能得出正确结果了:

 current loss is 94.19785
 current loss is 94.19785
 current loss is 94.19785
 current loss is 94.19785
 current loss is 94.19785

再看看预测的结果


# 下面来用数据做预测

# model只支持tensor类型的变量, 所以对model的输入要进行转换, 而画图则要转化成numpy类型

predicts = model(Variable(train_x)).data.numpy()

plt.figure()

plt.plot(X, y, 'go', label=u'original data')

plt.plot(X, coef*X, 'b', label=u'ground truth')

plt.plot(X, predicts, 'r', label=u'predicted data')

plt.legend()

plt.show()

从结果图上来看还是很准的

猜你喜欢

转载自blog.csdn.net/u012840636/article/details/78993893