admin管理员组文章数量:1794759
采用自动微分进行模型的训练
自动微分训练模型
简单代码实现:
代码语言:javascript代码运行次数:0运行复制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
层后得到输出。
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)
2.准备训练数据:
x_train
和 y_train
分别是输入和目标输出的训练数据。每个张量表示一个样本,x_train
中的每个元素是一个维度为1的张量,因为模型的输入维度是1。
x_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),用于更新模型参数以最小化损失。
model = 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()
来更新模型参数。
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}')
5.测试模型:
x_test
是用来测试模型的输入数据,这里表示输入为4.0。
model(x_test)
对 x_test
进行前向传播,得到预测结果 predicted
。
predicted.item()
取出预测结果的标量值并打印出来。
x_test = torch.tensor([[4.0]])
predicted = model(x_test)
print(f'预测值: {predicted.item():.4f}')
运行结果:
运行结果如下:
本文标签: 采用自动微分进行模型的训练
版权声明:本文标题:采用自动微分进行模型的训练 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1754804962a1706656.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论