自动微分训练模型
简单代码实现:
python
import torch
import torch.nn as nn
import torch.optim as optim
# 定义一个简单的线性回归模型
class LinearRegression(nn.Module):
def __init__(self):
super(LinearRegression, self).__init__()
self.linear = nn.Linear(1, 1) # 输入维度是1,输出维度也是1
def forward(self, x):
return self.linear(x)
# 准备训练数据
x_train = torch.tensor([[1.0], [2.0], [3.0]])
y_train = torch.tensor([[2.0], [4.0], [6.0]])
# 实例化模型、损失函数和优化器
model = LinearRegression()
criterion = nn.MSELoss() # 均方误差损失函数
optimizer = optim.SGD(model.parameters(), lr=0.01) # 随机梯度下降优化器
# 训练模型
epochs = 1000
for epoch in range(epochs):
# 前向传播
outputs = model(x_train)
loss = criterion(outputs, y_train)
# 反向传播
optimizer.zero_grad() # 清空之前的梯度
loss.backward() # 自动计算梯度
optimizer.step() # 更新模型参数
if (epoch+1) % 100 == 0:
print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')
# 测试模型
x_test = torch.tensor([[4.0]])
predicted = model(x_test)
print(f'预测值: {predicted.item():.4f}')
代码分解:
1.定义一个简单的线性回归模型:
-
LinearRegression
类继承自nn.Module
,这是所有神经网络模型的基类。 -
在
__init__
方法中,定义了一个线性层self.linear
,它的输入维度是1,输出维度也是1。 -
forward
方法定义了数据在模型中的传播路径,即输入x
经过self.linear
层后得到输出。pythonclass LinearRegression(nn.Module): def __init__(self): super(LinearRegression, self).__init__() self.linear = nn.Linear(1, 1) # 输入维度是1,输出维度也是1 def forward(self, x): return self.linear(x)
2.准备训练数据:
-
x_train
和y_train
分别是输入和目标输出的训练数据。每个张量表示一个样本,x_train
中的每个元素是一个维度为1的张量,因为模型的输入维度是1。pythonx_train = torch.tensor([[1.0], [2.0], [3.0]]) y_train = torch.tensor([[2.0], [4.0], [6.0]])
3.实例化模型,损失函数和优化器:
-
model
是我们定义的LinearRegression
类的一个实例,即我们要训练的线性回归模型。 -
criterion
是损失函数,这里选择了均方误差损失(MSE Loss),用于衡量预测值与实际值之间的差异。 -
optimizer
是优化器,这里选择了随机梯度下降(SGD),用于更新模型参数以最小化损失。pythonmodel = LinearRegression() criterion = nn.MSELoss() # 均方误差损失函数 optimizer = optim.SGD(model.parameters(), lr=0.01) # 随机梯度下降优化器
4.训练模型:
-
这里进行了1000次迭代的训练过程。
-
在每个迭代中,首先进行前向传播,计算模型对
x_train
的预测输出outputs
,然后计算损失loss
。 -
调用
optimizer.zero_grad()
来++清空之前的梯度++ ,然后调用loss.backward()
++自动计算梯度++ ,最后调用optimizer.step()
来++更新模型参数++ 。pythonepochs = 1000 for epoch in range(epochs): # 前向传播 outputs = model(x_train) loss = criterion(outputs, y_train) # 反向传播 optimizer.zero_grad() # 清空之前的梯度 loss.backward() # 自动计算梯度 optimizer.step() # 更新模型参数 if (epoch+1) % 100 == 0: print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')
5.测试模型:
-
x_test
是用来测试模型的输入数据,这里表示输入为4.0。 -
model(x_test)
对x_test
进行前向传播,得到预测结果predicted
。 -
predicted.item()
取出预测结果的标量值并打印出来。pythonx_test = torch.tensor([[4.0]]) predicted = model(x_test) print(f'预测值: {predicted.item():.4f}')