采用自动微分进行模型的训练

自动微分训练模型

简单代码实现:

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 层后得到输出。

    python 复制代码
    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_trainy_train 分别是输入和目标输出的训练数据。每个张量表示一个样本,x_train 中的每个元素是一个维度为1的张量,因为模型的输入维度是1。

    python 复制代码
    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),用于更新模型参数以最小化损失。

    python 复制代码
    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() 来++更新模型参数++ 。

    python 复制代码
    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() 取出预测结果的标量值并打印出来。

    python 复制代码
    x_test = torch.tensor([[4.0]])
    predicted = model(x_test)
    print(f'预测值: {predicted.item():.4f}')

运行结果:

运行结果如下:

相关推荐
火兮明兮7 分钟前
Python训练第四十五天
开发语言·python
鼓掌MVP10 分钟前
边缘计算应用实践心得
人工智能·边缘计算
zdy126357468811 分钟前
python43天
python·深度学习·机器学习
QYR_1112 分钟前
宠物车载安全座椅市场报告:解读行业趋势与投资前景
大数据·人工智能
wswlqsss16 分钟前
第四十五天打卡
人工智能·深度学习
Likeadust20 分钟前
视频汇聚平台EasyCVR“明厨亮灶”方案筑牢旅游景区餐饮安全品质防线
网络·人工智能·音视频
天翼云开发者社区33 分钟前
总决赛定档!“天翼云息壤杯”高校AI大赛巅峰之战即将打响!
人工智能·ai大赛
亚马逊云开发者43 分钟前
Amazon Bedrock 助力 SolveX.AI 构建智能解题 Agent,打造头部教育科技应用
人工智能
搏博1 小时前
将图形可视化工具的 Python 脚本打包为 Windows 应用程序
开发语言·windows·python·matplotlib·数据可视化
硅基茶水间1 小时前
「轻量级AI编程桌面软件」代码上下文一键搞定|已开源
python