当前位置: 首页 > news >正文

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

 自动微分训练模型

 简单代码实现:

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,输出维度也是1def 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,输出维度也是1def 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}')
    

运行结果:

运行结果如下:

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 睡前故事—绿色科技的未来:可持续发展的梦幻故事
  • 数据建设实践之大数据平台(五)安装hive
  • 企业网络实验(vmware虚拟机充当DHCP服务器)所有IP全部保留,只为已知mac分配固定IP
  • 从产品手册用户心理学分析到程序可用性与易用性的重要区别
  • 启智畅想火车类集装箱号码识别技术,软硬件解决方案
  • 新一代大语言模型 GPT-5 对工作与生活的影响及应对策略
  • LDAPWordlistHarvester:基于LDAP数据的字典生成工具
  • django-ckeditor富文本编辑器
  • 团体程序设计天梯赛-练习集
  • Ubuntu上安装配置samba服务
  • 【Quart 框架——来源于Flask的强大且灵活的异步Web框架】
  • 【 香橙派 AIpro评测】烧系统运行部署LLMS大模型跑开源yolov5物体检测并体验Jupyter Lab AI 应用样例(新手入门)
  • K8S 上部署 Emqx
  • 【C++】C++中的堆和栈介绍和区别
  • 酷克数据亮相第13届PostgreSQL中国技术大会,获数据库杰出贡献奖
  • 《深入 React 技术栈》
  • flutter的key在widget list的作用以及必要性
  • Fundebug计费标准解释:事件数是如何定义的?
  • JavaScript设计模式与开发实践系列之策略模式
  • MQ框架的比较
  • MySQL数据库运维之数据恢复
  • Spark学习笔记之相关记录
  • 阿里云前端周刊 - 第 26 期
  • 构造函数(constructor)与原型链(prototype)关系
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 力扣(LeetCode)357
  • 浅谈Golang中select的用法
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 事件委托的小应用
  • 我从编程教室毕业
  • 一道闭包题引发的思考
  • 用Canvas画一棵二叉树
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • k8s使用glusterfs实现动态持久化存储
  • (007)XHTML文档之标题——h1~h6
  • (2)STL算法之元素计数
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (C11) 泛型表达式
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (LeetCode C++)盛最多水的容器
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .Family_物联网
  • .Mobi域名介绍
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET CORE Aws S3 使用
  • .NET Core 发展历程和版本迭代
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境