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.来看一下拟合过程,直观感受一下梯度下降的概念
欢迎学习交流!