Torch 入门教程
文章目录
- Torch 入门教程
- Torch 的基础知识
- torch和PyTorch什么区别?
- Tensor
- Autograd
- Optimizer
- 举例一
- 模型定义
- 模型训练
- 模型保存和加载
- 模型评估
- 举例二
- 数据载入
- 模型定义和训练
- 模型测试
- 总结
Torch 入门教程
这是一篇针对 Torch 框架的入门教程,主要介绍 Torch 的基础知识、数据载入、模型定义和训练,以及模型测试。
Torch 的基础知识
Torch 是一个基于 Lua 编程语言的科学计算框架,主要用于深度学习研究。在 Torch 中,所有的数据都可以被表示为多维张量(tensor),并且支持自动求导。Torch 同时也提供了一些常见的深度学习模型和优化算法的实现。
torch和PyTorch什么区别?
torch 和 PyTorch 是两个不同的概念。
torch 是 PyTorch 默认的数据结构库,其提供了多种张量操作函数,包括 torch.Tensor,torch.nn,torch.optim 等模块。在 PyTorch 中使用 torch 库创建 Tensor、执行张量运算等,因此我们可以认为 torch 是 PyTorch 框架中的一部分。
而 PyTorch 则是一个完整的深度学习框架,以计算图为核心,提供了完善的模型定义、训练、推理等功能。
因此,torch 和 PyTorch 是不同的概念,但在 PyTorch 中使用 torch 库是必须的。
Tensor
Tensor(张量)是 Torch 中最常见的数据结构,类似于 Numpy 中的数组,可以表示多维数据。Tensor 可以在 CPU 和 GPU 上进行计算,也支持自动求导。
创建一个 Tensor:
import torch# 创建一个空的 Tensor,2 表示 2 维,3 表示第一维的长度,4 表示第二位的长度
x = torch.empty(2, 3, 4)# 创建一个随机初始化的 Tensor
x = torch.rand(2, 3)# 创建一个全 0 Tensor
x = torch.zeros(2, 3)# 创建一个全 1 Tensor
x = torch.ones(2, 3)# 从 Numpy 数组创建一个 Tensor
import numpy as np
x = torch.from_numpy(np.array([[1, 2], [3, 4]]))
Tensor 的形状(shape)可以通过 size()
方法获取:
x = torch.rand(2, 3)
print(x.size()) # 输出: torch.Size([2, 3])
Tensor 的数据类型(dtype)可以通过 Tensor 的构造函数指定,也可以通过 dtype
属性获取:
x = torch.rand(2, 3, dtype=torch.float)
print(x.dtype) # 输出: torch.float32
可以使用 to()
方法将 Tensor 移动到指定设备(CPU 或 GPU):
# 检查是否有可用的 GPU
if torch.cuda.is_available():device = torch.device("cuda") # GPU 设备
else:device = torch.device("cpu") # CPU 设备x = x.to(device)
Autograd
Autograd(自动求导)是 Torch 中的自动微分引擎,用于计算梯度。Autograd 在记录 Tensor 上的所有操作,并构建一个有向无环图(DAG),在反向传播时自动计算梯度。
创建一个可求导的 Tensor:
import torchx = torch.ones(2, 3, requires_grad=True)
print(x.requires_grad) # 输出: True
可以通过 backword()
方法计算梯度:
y = x.sum()
y.backward()
print(x.grad) # 输出: tensor([[1., 1., 1.],# [1., 1., 1.]])
注意:只有形状为标量的 Tensor(例如单个数值),才能调用 backword()
方法计算梯度,对于其他形状的 Tensor,需要对其中一个元素进行求和操作。
y = x.sum()
y.backward()
print(x.grad) # 输出: tensor([[1., 1., 1.],# [1., 1., 1.]])
Optimizer
Optimizer(优化器)是 Torch 中用于优化模型参数的算法。常用的优化器包括随机梯度下降(SGD)、Adam、Adagrad 等。
import torch
import torch.optim as optim# 定义一个模型和优化器
model = ...
optimizer = optim.SGD(model.parameters(), lr=0.1)# 在训练循环中使用优化器
optimizer.zero_grad()
loss_fn(model(input), target).backward()
optimizer.step()
举例一
模型定义
在 Torch 中,可以通过继承 torch.nn.Module
类来定义自己的深度学习模型。例如,下面是一个简单的全连接神经网络:
import torchclass Net(torch.nn.Module):def __init__(self):super(Net, self).__init__()self.fc1 = torch.nn.Linear(784, 256)self.fc2 = torch.nn.Linear(256, 10)def forward(self, x):x = torch.flatten(x, start_dim=1)x = torch.relu(self.fc1(x))x = self.fc2(x)return xmodel = Net()
以上代码中,Net
类继承自 torch.nn.Module
,并定义了两个全连接层(self.fc1
和 self.fc2
)。在 forward()
方法中,先将输入数据展开成一维向量(torch.flatten(x)
),然后依次经过两个全连接层和一个 ReLU 激活函数,最后输出模型的预测结果。
模型训练
在训练模型之前,需要定义损失函数和优化器。常见的损失函数有交叉熵(torch.nn.CrossEntropyLoss()
)和均方误差(torch.nn.MSELoss()
),常见的优化器有随机梯度下降(torch.optim.SGD()
)和 Adam(torch.optim.Adam()
)。
import torch
import torch.optim as optim# 定义模型和损失函数
model = ...
loss_fn = torch.nn.CrossEntropyLoss()# 定义优化器
optimizer = optim.SGD(model.parameters(), lr=0.01)# 训练模型
for epoch in range(num_epochs):for i, (inputs, labels) in enumerate(train_loader):optimizer.zero_grad() # 清空梯度outputs = model(inputs) # 正向传播loss = loss_fn(outputs, labels) # 计算损失loss.backward() # 反向传播optimizer.step() # 更新参数
以上代码中,num_epochs
表示训练轮数,train_loader
表示用于载入训练数据的迭代器对象。在每一轮训练中,先将梯度清零(optimizer.zero_grad()
),然后进行模型的正向传播(model(inputs)
),接着计算损失(loss_fn(outputs, labels)
),再进行反向传播计算梯度(loss.backward()
),最后调用优化器的 step()
方法更新模型参数。
模型保存和加载
在训练完成后,可以将模型保存到文件中,以便在之后的使用中加载模型并进行预测。
保存模型:
torch.save(model.state_dict(), 'model.pt')
加载模型:
model = Net()
model.load_state_dict(torch.load('model.pt'))
模型评估
训练完模型后,可以使用以下代码计算测试集上的准确率:
model.eval() # 设置模型为评估模式correct = 0
total = 0with torch.no_grad():for inputs, labels in test_loader:outputs = model(inputs)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print(f'Accuracy: {100 * correct / total:.2f}%')
以上代码中,model.eval()
表示设置模型为评估模式,关闭 Dropout 和 BatchNorm 层的随机性行为。然后对测试集中的每个样本进行预测(outputs = model(inputs)
),取预测结果的最大值作为模型最终的预测结果(_, predicted = torch.max(outputs.data, 1)
)。最终计算预测正确的样本数量和总样本数量,计算准确率。
举例二
数据载入
在 Torch 中,可以使用 torchvision
模块来载入常用的数据集,例如 MNIST、CIFAR-10 等。
import torch
import torchvisiontrain_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=None, download=True)
test_dataset = torchvision.datasets.MNIST(root='./data', train=False, transform=None, download=True)train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=128, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=128, shuffle=True)
以上代码中,train_dataset
和 test_dataset
分别表示训练集和测试集,train_loader
和 test_loader
则是用于载入数据的迭代器对象。其中,batch_size
表示每个批次的大小,shuffle
表示是否打乱数据顺序。
模型定义和训练
在 Torch 中,可以通过继承 torch.nn.Module
类来定义自己的深度学习模型。例如,下面是一个简单的全连接神经网络:
class Net(torch.nn.Module):def __init__(self):super(Net, self).__init__()self.fc1 = torch.nn.Linear(784, 256)self.fc2 = torch.nn.Linear(256, 10)def forward(self, x):x = torch.flatten(x, start_dim=1)x = torch.relu(self.fc1(x))x = self.fc2(x)return x
以上代码中,__init__
方法用于定义模型结构,forward
方法则用于定义模型的前向计算流程。
定义好模型后,可以使用以下代码进行训练:
model = Net()
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)for epoch in range(10):for i, (inputs, labels) in enumerate(train_loader):optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()if i % 100 == 0:print(f'Epoch: {epoch+1}, Batch: {i+1}, Loss: {loss.item():.4f}')
以上代码中,criterion
和 optimizer
分别表示损失函数和优化算法。在训练过程中,先将梯度清零(optimizer.zero_grad()
),然后计算模型输出和损失(outputs
和 loss
),再调用 backward()
方法计算梯度,最后调用 optimizer.step()
方法更新模型参数。
模型测试
在训练完模型后,可以使用以下代码进行测试:
correct = 0
total = 0with torch.no_grad():for inputs, labels in test_loader:outputs = model(inputs)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum()print(f'Accuracy: {100 * correct / total:.2f}%')
以上代码中,torch.no_grad()
表示在测试过程中不需要计算梯度。对于每个测试样本,计算模型输出并取预测结果的最大值(predicted
),然后统计预测正确的样本数量和总样本数量,最后计算准确率。
总结
这篇 Torch 入门教程主要包括以下几个方面:
- Tensor:介绍了 Torch 中最常见的数据结构 Tensor,并介绍 Tensor 的创建、形状、数据类型以及如何在 CPU 和 GPU 上进行计算。
- Autograd:介绍了 Torch 中的自动求导引擎 Autograd,并介绍了如何创建可求导的 Tensor,以及如何使用
backward()
方法计算梯度。 - Optimizer:介绍了 Torch 中的优化器,包括如何定义优化器,如何在训练循环中使用优化器。
- 模型定义:介绍了如何继承
torch.nn.Module
类来定义深度学习模型,在__init__()
方法中定义网络结构,在forward()
方法中定义前向计算流程。 - 模型训练:介绍了如何训练深度学习模型,包括定义损失函数和优化器,调用前向传播、反向传播函数,以及如何使用优化器更新模型参数。
- 模型保存和加载:介绍了如何将训练好的模型保存到文件,并在之后的使用中加载模型以进行预测。
- 模型评估:介绍了如何使用训练好的模型计算测试集的准确率。
总的来说,本教程是一个完整的 Torch 入门教程,涵盖了从数据载入到模型定义、训练和评估的整个流程,对于希望学习深度学习和 Torch 框架的初学者来说,是一个很好的起点。
Torch 入门教程相关推荐
- 【CV】Pytorch一小时入门教程-代码详解
目录 一.关键部分代码分解 1.定义网络 2.损失函数(代价函数) 3.更新权值 二.训练完整的分类器 1.数据处理 2. 训练模型(代码详解) CPU训练 GPU训练 CPU版本与GPU版本代码区别 ...
- wandb: 深度学习轻量级可视化工具入门教程
本文,就来给大家介绍一款新型的机器学习可视化工具,能够让人工智能研发过程变得更加简单明了. wandb: 深度学习轻量级可视化工具入门教程 引言 wandb 验证数据可视化 自然语言处理 重要工具 极 ...
- 转g代码教程_图深度学习入门教程(九)——图滤波神经网络模型
本教程是一个系列免费教程,争取每月更新2到4篇.(由于精力有限,近期停止了一段时间,在此向大家道个歉). 主要是基于图深度学习的入门内容.讲述最基本的基础知识,其中包括深度学习.数学.图神经网络等相关 ...
- 模型部署入门教程(一):模型部署简介
前言 OpenMMLab 的算法如何部署?是很多社区用户的困惑.而模型部署工具箱 MMDeploy 的开源,强势打通了从算法模型到应用程序这 "最后一公里"! 今天我们将开启模型部 ...
- 深度学习小白入门教程-基础环境篇
深度学习小白入门教程-基础环境篇 如有图片显示失败,请回小主主页查看~ Anaconda 安装包下载方式一:官网(科学上网比较慢,不推荐) 安装包下载方式二:清华镜像(推荐) 具体安装步骤(跟着箭头来 ...
- Detectron2入门教程
参考 Detectron2入门教程 - 云+社区 - 腾讯云 目录 1. 概述 1.1. 自己的源码阅读流程 1.2. 目录结构 1.3. 搭积木过程 1.4. 官方文档阅读 2. 数据处理 2.1 ...
- oak深度相机入门教程-使用NN模型生成点云
系列文章目录: oak深度相机入门教程-识别眼睛的凝视方向 oak深度相机入门教程-检测是否佩戴口罩 oak深度相机入门教程-文本检测+光学字符识别(OCR)管道 oak深度相机入门教程-识别人的 ...
- Kafka入门教程与详解
1 Kafka入门教程 1.1 消息队列(Message Queue) Message Queue消息传送系统提供传送服务.消息传送依赖于大量支持组件,这些组件负责处理连接服务.消息的路由和传送.持久 ...
- python tornado教程_Tornado 简单入门教程(零)——准备工作
前言: 这两天在学着用Python + Tornado +MongoDB来做Web开发(哈哈哈这个词好高端).学的过程中查阅了无数资料,也收获了一些经验,所以希望总结出一份简易入门教程供初学者参考.完 ...
最新文章
- Android中的BuildConfig类怎么来的
- 每日一皮:虽然我们交付了V2版本,但用户仍然使用V1版本...
- matplotlib 标签_Python可视化matplotlibamp;seborn14热图heatmap
- if __name__ == __main__:什么意思_好冷的Python if __name__==__main__是啥东东
- C语言里最基础的关键字
- java适合几岁的人学_Java适合什么人群学习?
- 计算机网络学习笔记:第三章
- VC socket 发送类对象
- 2016蓝桥杯C++A组第六题 寒假作业【暴力搜索】
- C# 调用C++DLL声明 常规参数/结构体/指针/数组
- 第二阶段个人工作总结03
- 第十届全国大学生智能汽车竞赛获奖名单
- 年薪 200w 的华为员工了解一下
- 简易登录以及注册界面制作
- 程序员如何提升英语水平
- Dell Inspiron 5520 笔记本盲刷BIOS
- 两阶段市场投标策略。 电力市场程序。 日前日内竞价 提出了日前电力市场和实时电力市场下充电站的投标策略
- Selenium自动化测试入门(基于Python)
- WIN10下安装Oracle提示无法添加用户XXXX到XXXX组中办法
- 常用基础css样式快速记忆法
热门文章
- arm汇编和c语言混合编程实验报告,arm实验ARM汇编和C语言混合编程.doc
- 最新出炉 csdn最牛最全JMeter+Ant+Jenkins接口自动化测试框架(Windows)
- 错误:找不到符号 类XXX 位置:程序包 com.xxx.xxx
- pos机linux下的对应程序
- 穿(string类的运用)
- 2020 EC Final 诸事不顺记
- Windows/Linux 系统纯净镜像分享【来自I Tell You】
- Hive 窗口函数(开窗函数) over
- 关闭安卓手机的按键背景灯
- 新神魔大陆服务器现在在维护吗,新神魔大陆1月22日合服维护公告