pytorch 一维线性模型,一维线性回归,matplotlib 显示

预备知识

python语言基础知识

[百度网盘python 基础电子书提取码 :6ttd]
(%E9%93%BE%E6%8E%A5%EF%BC%9Ahttps://pan.baidu.com/s/11tZeXGQ8eMorn9XLLbuooQ)
文档密码私聊我(受版权保护不方便透露)

matplotlib .pyplot.plot基础
import matplotlib.pyplot as plt
plt.plot(*args,**kwargs)

args:前两个位置参数用来设置折线图上若干端点的坐标,其中:
第一个参数用来指定折线图上一个或多个端点的x坐标
第二个参数用来指定折线图上一个或多个端点的y坐标
第三个位置参数用来同时指定折线图的颜色、线型和标记符号形状(也可以通过美 键参数 kwargs 指定),其中 •颜色可以取值为r(红色)、‘g(绿色)、‘b’(蓝色)、‘℃’(青色)、‘m(品红色)、 y’(黄色)、‘K(黑色)、‘w’(白色) •线型常用的取值有’’(实心线)、’-’(短划线)、’-’(点划线)和"’:’(点线) •标记符号可能的取值有’.’(圆点)、‘o’(圆圈)、‘v’(向下的三角形)、’(向上的 三角形)、▽(向左的三角形)、’>’(向右的三角形)、"
’(五角星)、’+(加号)、’ (下画线)、‘X’(x 符号)、‘D’(菱形)
**kwargs:用来设置标签宽度,线宽,反走样。

再让我水一会,先浅讲一下一维线性回归

假设给定数据集{(x1,y1),(x2,y2),(x3,y3),…,(xm,ym)},线性回归希望能够优化出一个好的函数f(x) , 使f(x) = wx + b ,接近target。

#咳咳咳,不水了,上代码
import numpy as np
import matplotlib.pyplot as plt
from torch import nn
from torch.autograd import Variable
import torch
# 若RuntimeError: expected scalar type Float but found Double 使用下面一行代码
torch.set_default_tensor_type(torch.DoubleTensor)
x_train = np.array([[3.3],[4.4],[5.5],[6.71],[6.93],
                    [9.7],[7.8],[2.1],[8.8],[10.892],
                    [3.14],[8.18],[10.26],[7.18],[10.30]])
y_train = np.array([[1.8],[3.14],[8],[5.23],[5.21],
                    [5.20],[6.18],[1.11],[2.95],[9.87],
                    [6.67],[8.21],[7.93],[3.89],[9.91]])
#将numpy型转换为Tensor
inputs = torch.from_numpy(x_train)
targets = torch.from_numpy(y_train)


#搭建模型
class Lixiang(nn.Module):
    def __init__(self):
        super(Lixiang, self).__init__()
        #Applies a linear transformation to the incoming data: :math:`y = xA^T + b`
        self.liner = nn.Linear(1, 1)#对传入的数据进行线性变换

    def forward(self, x):
        output = self.liner(x)
        return output
lixing = Lixiang()# 实例化模型

# 创建损失函数
loss_d = nn.MSELoss()
# 优化函数
optimizier = torch.optim.SGD(lixing.parameters(),lr=1e-2)

# 判断gpu是否可用 cuda
if torch.cuda.is_available():
    lixing = lixing.cuda()
    inputs = Variable(inputs)
    targets = Variable(targets)

# 开始训练
epochs = 300 #设置训练次数,我们在这里设为300
for epoch in range(epochs):
    # forward
    output = lixing(inputs)
    loss = loss_d(output,targets)#得到损失函数
    #backward
    optimizier.zero_grad()#归零梯度,防止叠加,不然梯度会叠加使结果不收敛
    loss.backward()#反向传播
    optimizier.step()#更新参数

    #每二十次,输出损失
    if (epoch+1) % 20 == 0:
        print('训练次数: {}  Loss : {}'.format(epoch+1,loss.item()))#item返回真实值

# 预测结果
lixing.eval()
predict = lixing(Variable(inputs))
predict = predict.data.numpy()
plt.plot(inputs ,targets,'ro',label = 'Original data')
plt.plot(inputs,predict,label='Fitting Line')

plt.show()

由于数据比较少,结果看着有点偏差,可以多增添一些数据,增加训练次数来使模型更加准确。
pytorch 一维线性模型,一维线性回归,matplotlib 显示_第1张图片
希望大家可以支持一下,谢谢啦!

你可能感兴趣的:(pytorch)