当建立了数据的特征和目标集,就可以开始训练多项式回归模型了。在此教程中,我们将搭建一个多项式回归模型,根据公式f(x)=ax^3+bx^2+cx+d进行拟合。
数据预处理
import torch
import numpy as np
# 设置随机种子,保证结果可复现
torch.manual_seed(2021)
# 创建训练数据和测试数据
x_train = np.array([-3, -2, -1, 0, 1, 2, 3], dtype=np.float32)
y_train = np.array([3, 2, 1, 0, 1, 2, 3], dtype=np.float32)
x_train = torch.from_numpy(x_train.reshape(-1, 1))
y_train = torch.from_numpy(y_train.reshape(-1, 1))
我们使用numpy创建了特征集x_train和目标集y_train,并将它们转换成了PyTorch张量。需要将特征集进行reshape操作,使其变成n行1列的张量,以符合PyTorch的输入格式。
定义模型
import torch.nn as nn
class PolynomialRegression(nn.Module):
def __init__(self, input_dim, output_dim):
super(PolynomialRegression, self).__init__()
self.poly = nn.Sequential(
nn.Linear(input_dim, 3),
nn.ReLU(),
nn.Linear(3, 4),
nn.ReLU(),
nn.Linear(4, output_dim)
)
def forward(self, x):
out = self.poly(x)
return out
我们使用PyTorch的nn.Module类创建了PolynomialRegression类,并重写了其构造函数和前向传播函数。模型的每一层都通过nn.Linear()函数创建,前三层分别有3个神经元、4个神经元和1个神经元。其中中间的ReLU激活函数是为了增加非线性效应。
训练模型
# 模型训练
model = PolynomialRegression(input_dim=1, output_dim=1)
criterion = nn.MSELoss() # 损失函数
optimizer = torch.optim.SGD(model.parameters(), lr=0.03) # 优化函数
num_epochs = 2000
for epoch in range(num_epochs):
# 前向传播
outputs = model(x_train)
loss = criterion(outputs, y_train)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (epoch + 1) % 100 == 0:
print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item()))
在这里,我们设置了2000轮的训练,并以均方误差作为损失函数。通过反向传播和优化函数进行优化,即可训练模型。输出结果为每100次训练后的损失函数值,用于观察模型的训练情况。
模型预测
# 预测模型结果
model.eval()
predict = model(x_train)
predict = predict.data.numpy()
# 数据可视化
import matplotlib.pyplot as plt
plt.plot(x_train.numpy(), y_train.numpy(), 'ro', label='Original Data')
plt.plot(x_train.numpy(), predict, label='Fitting Line')
plt.legend()
plt.show()
最后,我们使用模型对训练数据进行预测,并将结果可视化,以便更好地理解模型的拟合效果。
示例说明1:将数据进行归一化处理
我们可以在数据预处理步骤中加入数据归一化的操作以提升模型效果。在下列代码中,将原始数据除以5来缩小数据范围,并在模型预测步骤中进行数据反归一化操作。
# 特征集归一化处理
x_train = (x_train - x_train.mean()) / x_train.std()
# 目标集归一化处理
y_train = (y_train - y_train.mean()) / y_train.std()
# ...(省略定义模型,训练模型部分代码)
# 预测模型结果
model.eval()
predict = model(x_train)
predict = predict * y_train.std() + y_train.mean()
predict = predict.data.numpy()
# 数据可视化
import matplotlib.pyplot as plt
plt.plot(x_train.numpy(), y_train.numpy(), 'ro', label='Original Data')
plt.plot(x_train.numpy(), predict, label='Fitting Line')
plt.legend()
plt.show()
示例说明2:将多项式回归模型更改为二次函数拟合
我们可以将多项式回归中拟合的公式f(x)=ax^3+bx^2+cx+d变更为f(x)=ax^2+bx+c,从而实现二次函数拟合,示例如下:
class QuadraticRegression(nn.Module):
def __init__(self, input_dim, output_dim):
super(QuadraticRegression, self).__init__()
self.poly = nn.Sequential(
nn.Linear(input_dim, 2),
nn.ReLU(),
nn.Linear(2, output_dim)
)
def forward(self, x):
out = self.poly(x)
return out
# ...(省略数据预处理,训练模型、预测模型、数据可视化等步骤)
# 创建二次函数拟合模型
model = QuadraticRegression(input_dim=1, output_dim=1)
通过这样的修改,我们可以更灵活地拟合不同形状的曲线。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PyTorch搭建多项式回归模型(三) - Python技术站