Pytorch使用 Demo之平面拟合,预测随机生成点

今天Pytorch初体验。使用一些简单的函数来实现简单的预测问题

环境配置:

import torch
from matplotlib import animation
from torch.autograd import Variable
import matplotlib.pyplot as plt
import numpy as np

1.首先来构造一个我们需要预测的随机模型,在此我们设计一个简单模型。即在3d坐标轴中,选取某一平面的一段范围,在两测随机生成不同距离的散点,如图所示:

这里的随机点生成我们使用torch.rand(),并用matplotlib绘图展示

代码实现如下:

 

 

    x = Variable(torch.linspace(0, 100).type(torch.FloatTensor))
    # Variable封装
    rand1 = Variable(torch.rand(100)) * 100
    y = x+rand1
    rand2 = Variable(torch.rand(100)) * 50
    z = x+rand2
    x_train = x[:-15]
    x_test = x[-15:]
    y_train = y[:-15]
    y_test = y[-15:]
    z_train = z[:-15]
    z_test = z[-15:]

    # matplotlib操作
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')

    plt.title("随机生成散点数据集", fontproperties="SimHei", fontsize=30)
    ax.scatter(x_train.data.numpy(), y_train.data.numpy(), z_train.data.numpy())
    ax.set_xlabel('X Label')
    ax.set_ylabel('Y Label')
    ax.set_zlabel('Z Label')

    plt.show()

 

2.生成随机平面,随后通过计算各散点到平面的距离(可以很好地理解为loss),通过梯度下降的方法使loss不断减小,与此同时平面逐渐拟合各散点

代码如下:

a = Variable(torch.rand(1),requires_grad = True)
    b = Variable(torch.rand(1),requires_grad = True)
    d = Variable(torch.rand(1),requires_grad = True)
    learing_rate =0.00001
    losss=[]

    for i in range(1000):
        predictions=a.expand_as(x_train)*x_train+b.expand_as(x_train)*y_train+d.expand_as(x_train)
        prea.append(float(a.data))
        preb.append(float(b.data))
        pred.append(float(d.data))
        # expand转换成as()类型
        loss=torch.mean((predictions-z_train)**2)
        print("Loss rate:",loss.data)
        losss.append(loss)
        loss.backward()
        a.data.add_(- learing_rate * a.grad.data)
        b.data.add_(- learing_rate * b.grad.data)
        d.data.add_(- learing_rate * d.grad.data)
        a.grad.data.zero_()
        b.grad.data.zero_()
        d.grad.data.zero_()
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')

    plt.title("平面拟合散点", fontproperties="SimHei", fontsize=30)
    ax.scatter(x_train.data.numpy(), y_train.data.numpy(), z_train.data.numpy())
    ax.scatter(x_test.data.numpy(), y_test.data.numpy(), z_test.data.numpy(),c='#DC143C')
    adata=float(a.data.numpy()[0])
    bdata = float(b.data.numpy()[0])
    ddata=float(d.data.numpy()[0])
    x = np.arange(0, 100, 0.25)
    y = np.arange(0, 140, 0.25)

    # 生成网格数据
    X, Y = np.meshgrid(x, y)
    Z = adata * X + bdata * Y + ddata
    ax.plot_surface(X,Y,Z,
                    color='g',
                    alpha=0.6
                    )
    ax.set_xlabel('X Label')
    ax.set_ylabel('Y Label')
    ax.set_zlabel('Z Label')

    plt.show()

结果:可以看到测试集(红点)也靠近在平面周围

 

 

3.来看一下拟合过程,直观感受一下梯度下降的概念

 

 

欢迎学习交流!

posted @ 2021-05-05 22:12  XAN不会coding  阅读(328)  评论(0编辑  收藏  举报