您现在的位置是:首页 >技术教程 >Pytorch 小记 第二回:多项式模型代码网站首页技术教程
Pytorch 小记 第二回:多项式模型代码
简介Pytorch 小记 第二回:多项式模型代码
代码如下:
import torch
import numpy as np
import matplotlib.pyplot as plt
from torch.autograd import Variable
#定义多项式模型参数
a_origial=np.array([2.5, 3.5]) #定义参数
b_origina=np.array([1.8]) #定义参数
#定义目标变量x和y
x_original = np.arange(-5,5,0.5)
y_original = b_origina[0] + a_origial[0] * x_original + a_origial[1] * x_original ** 2
# 构建模型训练数据x和y
x_train = np.stack([x_original ** i for i in range(1, 3)], axis=1) # 准备[x,x^2]数据
x_train = torch.from_numpy(x_train).float() #数据类型转换成 float tensor
y_train = torch.from_numpy(y_original).float() .unsqueeze(1) # 数据类型转化成 float tensor
# 定义参数和模型
torch.manual_seed(2025)
a=Variable(torch.randn(2, 1), requires_grad=True)
b=Variable(torch.zeros(1), requires_grad=True)
# 将 x和 y 转化成 Variable
x_train =Variable(x_train)
y_train =Variable(y_train)
def multi_linear(x):
return torch.mm(x, a)+ b
# 计算误差
def get_loss(y_real, y):
return torch.mean((y_real - y_train) ** 2)
#进行 1000次参数更新
for k in range(1000):
y_pred = multi_linear(x_train)#计算函数值
loss = get_loss(y_pred, y_train)#损失计算
loss.backward()#梯度计算
#更新参数
a.data = a.data - 0.001 * a.grad.data
b.data = b.data - 0.001 * b.grad.data
if (k + 1) % 100 == 0:#误差显示
print('epoch {}, Loss: {:.5f}'.format(k + 1, loss))
a.grad.data.zero_()#梯度归零
b.grad.data.zero_()#梯度归零
#画出更新后的结果
y_pred = multi_linear(x_train)
plt.figure('二项式模型')#窗口命名
plt.plot(x_train.data.numpy()[:, 0], y_pred.data.numpy(), label='train curve',color='g')
plt.plot(x_train.data.numpy()[:, 0], y_original, label='real curve', color='r')
plt.legend()
plt.show()
小记
1、函数 np.arange()是一个用于创建等差数列的函数。
函数的返回值是一个一维数组。其中,第一个参数是起始值,第二个参数是终止值,第三个参数是步长。
例如:
a=np.arange(-2,2,0.5)
print('a=',a)
a= [-2. -1.5 -1. -0.5 0. 0.5 1. 1.5]
上例子a中共有8个数值,之间间隔为0.5,首个元素为-2。
a=np.arange(-2,2,1)
print('a=',a)
a= [-2 -1 0 1]
上例子a中共有4个数值,之间间隔为1,首个元素为-2。
2、函数 np.stack()是一个用于进行数组堆叠的函数。
第一个参数:输入需要堆叠的数组
第二个参数:指定堆叠的轴
例如:
对于如下的2个二维数组,可以进行如下方式堆叠
a=np.array([i for i in range(9)]).reshape(3,3)
b=np.array([i for i in range(9,18)]).reshape(3,3)
情况一:以 axis=0 的方式进行进行堆叠
result = np.stack((a, b), axis=0)
print(torch.Size(result.shape))
print('result=',result)
输出结果为
torch.Size([2, 3, 3])
result= [[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]]
[[ 9 10 11]
[12 13 14]
[15 16 17]]]
情况一:以 axis=1 的方式进行进行堆叠
result = np.stack((a, b), axis=1)
print(torch.Size(result.shape))
print('result=',result)
输出结果为
torch.Size([3, 2, 3])
result= [[[ 0 1 2]
[ 9 10 11]]
[[ 3 4 5]
[12 13 14]]
[[ 6 7 8]
[15 16 17]]]
情况三:以 axis=2 的方式进行进行堆叠
result = np.stack((a, b), axis=2)
print(torch.Size(result.shape))
print('result=',result)
输出结果为
torch.Size([3, 3, 2])
result= [[[ 0 9]
[ 1 10]
[ 2 11]]
[[ 3 12]
[ 4 13]
[ 5 14]]
[[ 6 15]
[ 7 16]
[ 8 17]]]
从结果可以看出,两种方式堆叠后都是三维,不同的是,以axis=0的方式堆叠,第一维是2;以axis=1的方式堆叠,第二维是2;axis=2的方式堆叠,第三维是2。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。