您现在的位置是:首页 >技术教程 >Pytorch 小记 第二回:多项式模型代码网站首页技术教程

Pytorch 小记 第二回:多项式模型代码

Start_Present 2025-05-06 00:01:02
简介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。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。