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

PyTorch快速入门

文章目录

  • 前言
  • 简介
  • 软件包导入
  • 创建张量
  • 类型操作
  • 索引
      • 直接索引
      • 切片索引
  • 维度变换
  • 增加维度
  • 删除维度
  • 维度重复
  • 维度交换
  • broadcast
  • 合并张量
  • 拆分张量
  • 运算
  • 最后

前言

你好,我是醉墨居士,今天分享一下PyTorch的基本使用的快速入门教程,希望能够帮助各位快速掌握PyTorch的使用

简介

PyTorch 是一个开源的深度学习框架,由 Facebook 的人工智能研究团队(FAIR)开发。它在学术界和工业界都被广泛使用,为深度学习的研究和应用提供了强大的支持

软件包导入

本教程中我们使用torch和numpy这两个包
如果是ubuntu系统,可以看这个教程配置环境:https://blog.csdn.net/qq_67733273/article/details/144787375

import torch
import numpy as np

创建张量

  • form list
print(torch.tensor([1, 2]), torch.tensor([[1, 2], [3, 4]]))
tensor([1, 2]) tensor([[1, 2],
        [3, 4]])
  • form numpy
print(torch.from_numpy(np.array([1, 2])))
tensor([1, 2])
  • 全0填充
print(torch.zeros(2, 3))
tensor([[0., 0., 0.],
        [0., 0., 0.]])
  • 全1填充
print(torch.ones(2, 3))
tensor([[1., 1., 1.],
        [1., 1., 1.]])
  • 自定义数值全部填充
print(torch.full([2, 3], 6))
tensor([[6, 6, 6],
        [6, 6, 6]])
  • 对角矩阵
print(torch.eye(3, 3))
tensor([[1., 0., 0.],
        [0., 1., 0.],
        [0., 0., 1.]])
  • 未初始化
print(torch.empty(2, 3))
tensor([[5.1981e-06, 0.0000e+00, 0.0000e+00],
        [0.0000e+00, 1.5134e-21, 4.2892e-41]])
  • 标准正态分布
print(torch.randn(2, 3))
tensor([[ 0.0711,  0.2728, -0.4199],
        [ 1.0625,  0.9611, -2.0447]])
  • 0 - 1浮点均匀分布
print(torch.rand(2, 3))
tensor([[0.2974, 0.6033, 0.7126],
        [0.1599, 0.5974, 0.8983]])
  • 1 - 9整数均匀分布
print(torch.randint(1, 10, [2, 3]))
tensor([[1, 2, 8],
        [9, 3, 4]])
  • 递增数列, 0 ~ 9,步长是2
print(torch.arange(0, 10, 2))
tensor([0, 2, 4, 6, 8])
  • 等差数列,0 ~ 10, 共计4个数
print(torch.linspace(0, 10, 4))
tensor([ 0.0000,  3.3333,  6.6667, 10.0000])
  • 指定类型创建
print(torch.FloatTensor([1, 2]), torch.LongTensor([1, 2]))
tensor([1., 2.]) tensor([1, 2])

类型操作

  • 获取数据类型
print(torch.randn(2, 3).dtype)
torch.float32
  • 转换数据类型
print(torch.randn(2, 3).to(torch.float64).dtype)
torch.float64
  • 张量形状
print(torch.randn(2, 3).shape)
torch.Size([2, 3])

索引

  • 测试数据

4张图片,3通道,28*28像素

a = torch.randn(4, 3, 28, 28)
print(a.shape)
torch.Size([4, 3, 28, 28])

直接索引

  • 查看第0张图片
print(a[0].shape)
torch.Size([3, 28, 28])
  • 查看第0张图片的第0个通道
print(a[0, 0].shape)
torch.Size([28, 28])
  • 查看第0张图片的第0个通道的第2行
print(a[0, 0, 2].shape)
torch.Size([28])
  • 查看第0张图片的第0个通道的第2行第4列
print(a[0, 0, 2, 4].shape)
torch.Size([])

切片索引

  • 查看0 - 1张图片, 其中 :2 表示 0 - 1
print(a[:2].shape)
torch.Size([2, 3, 28, 28])
  • 查看0 - 1张图片的0 - 1通道
print(a[:2, :2].shape)
torch.Size([2, 2, 28, 28])
  • 查看0 - 1张图片的所有通道的倒数5 - 正数24行, 其中 : 表示所有
print(a[:2, :, -5:25].shape)
torch.Size([2, 3, 2, 28])
  • 有间隔的索引,其中 ::2 表示每次间隔2个取值
print(a[:, :, :, ::2].shape)
torch.Size([4, 3, 28, 14])
  • 查看所有图片的第0 - 1列, 其中 … 表示省略
print(a[..., :2].shape)
torch.Size([4, 3, 28, 2])
  • 查看所有图片的第0 - 1行
print(a[..., :2, :].shape)
torch.Size([4, 3, 2, 28])
  • 查看第1张图片
print(a[1, ...].shape)
torch.Size([3, 28, 28])

维度变换

  • 测试数据

4张图片, 单通道, 28*28像素

a = torch.randn(4, 1, 28, 28)
print(a.shape)
torch.Size([4, 1, 28, 28])

  • 转换为4, 784维度
print(a.reshape(4, 784).shape)
torch.Size([4, 784])
  • 转换成4, 28, 28维度
print(a.reshape(4, 28, 28).shape)
torch.Size([4, 28, 28])
  • view的基本用法和reshape一致
print(a.view(4, 784).shape)
torch.Size([4, 784])

增加维度

  • 测试数据

2*2的tensor

a = torch.randn(2, 2)
print(a.shape)
torch.Size([2, 2])

  • 插入维度到第0维
print(a.unsqueeze(0).shape)
torch.Size([1, 2, 2])
  • 插入维度在倒数第1维
print(a.unsqueeze(-1).shape)
torch.Size([2, 2, 1])

删除维度

  • 测试数据

122*1的tensor

a = torch.randn(1, 2, 2, 1)
print(a.shape)
torch.Size([1, 2, 2, 1])

  • 删除第0维
print(a.squeeze(0).shape)
torch.Size([2, 2, 1])
  • 删除倒数第1维
print(a.squeeze(-1).shape)
torch.Size([1, 2, 2])
  • 删除所有为1的维度
print(a.squeeze().shape)
torch.Size([2, 2])

维度重复

  • 分别在第1个维度和第2个维度重复2和3次
print(torch.randn(2, 2).repeat(2, 3).shape)
torch.Size([4, 6])

维度交换

  • t转置,只能操作2维tensor
print(torch.randn(1, 2).t().shape)
torch.Size([2, 1])
  • 维度交换,指定交换的维度,只能两两交换
print(torch.randn(1, 2, 3).transpose(0, 1).shape)

  • 维度交换,输入维度的顺序
print(torch.rand(1, 2, 3).permute(2, 1, 0).shape)
torch.Size([2, 1, 3])

broadcast

  • 测试数据

3个张量

a = torch.randn(2, 3)
b = torch.randn(1, 3)
c = torch.randn(1)
print(a.shape)
print(b.shape)
print(c.shape)
torch.Size([2, 3])
torch.Size([1, 3])
torch.Size([1])

  • 自动boradcast
print((a + b).shape)
print((a + c).shape)
torch.Size([2, 3])
torch.Size([2, 3])
  • 手动boradcast
print(b.expand_as(a).shape)
print(c.expand_as(a).shape)
torch.Size([2, 3])
torch.Size([2, 3])

合并张量

  • 拼接,dim=0是指定要拼接的维度
a = torch.rand(4, 32, 8)
b = torch.rand(5, 32, 8)
print(a.shape)
print(b.shape)
print(torch.cat([a, b], dim=0).shape)
torch.Size([4, 32, 8])
torch.Size([5, 32, 8])
torch.Size([9, 32, 8])
  • 组合,创建一个新的维度,用于区分组合后的两个tensor
a = torch.rand(4, 32, 8)
b = torch.rand(4, 32, 8)
print(a.shape)
print(b.shape)
print(torch.stack([a, b], dim=0).shape)
torch.Size([4, 32, 8])
torch.Size([4, 32, 8])
torch.Size([2, 4, 32, 8])

拆分张量

  • 测试数据

1个张量

a = torch.rand(4, 32, 8)
print(a.shape)
torch.Size([4, 32, 8])

  • split拆分,在0维度上拆分,每2个元素1拆
b, c = a.split(2, dim=0)
print(b.shape)
print(c.shape)
torch.Size([2, 32, 8])
torch.Size([2, 32, 8])
  • split拆分,在0维度上拆分,拆分后长度分别为1,2,1
b, c, d = a.split([1, 2, 1], dim=0)
print(b.shape)
print(c.shape)
print(d.shape)
torch.Size([1, 32, 8])
torch.Size([2, 32, 8])
torch.Size([1, 32, 8])
  • chunk拆分,在0维度上拆分,拆成2个
b, c = a.chunk(2, dim=0)
print(b.shape)
print(c.shape)
torch.Size([2, 32, 8])
torch.Size([2, 32, 8])

运算

测试数据

2个张量

a = torch.FloatTensor([[0, 1.1, 2.2], [3.3, 4.4, 5.5]])
b = torch.FloatTensor([0, 1.1, 2.2])
print(a.shape)
print(b.shape)
torch.Size([2, 3])
torch.Size([3])
  • 矩阵乘法
print(a @ b)
print(a.matmul(b))
tensor([ 6.0500, 16.9400])
tensor([ 6.0500, 16.9400])
  • 四则运算,因为两个tensor的维度不同,会进行自动boradcast,然后计算
print(a + b)
print(a - b)
print(a * b)
print(a / b)
tensor([[0.0000, 2.2000, 4.4000],
        [3.3000, 5.5000, 7.7000]])
tensor([[0.0000, 0.0000, 0.0000],
        [3.3000, 3.3000, 3.3000]])
tensor([[ 0.0000,  1.2100,  4.8400],
        [ 0.0000,  4.8400, 12.1000]])
tensor([[   nan, 1.0000, 1.0000],
        [   inf, 4.0000, 2.5000]])
  • 求指数
print(a**2)
tensor([[ 0.0000,  1.2100,  4.8400],
        [10.8900, 19.3600, 30.2500]])
  • 开根号
print(a**0.5)
tensor([[0.0000, 1.0488, 1.4832],
        [1.8166, 2.0976, 2.3452]])
  • 求e的n次方
print(a.exp())
tensor([[  1.0000,   3.0042,   9.0250],
        [ 27.1126,  81.4509, 244.6919]])
  • 以e为底,求对数
print(a.log())
tensor([[  -inf, 0.0953, 0.7885],
        [1.1939, 1.4816, 1.7047]])
  • 以2为底,求对数
print(a.log2())
tensor([[  -inf, 0.1375, 1.1375],
        [1.7225, 2.1375, 2.4594]])
  • 大于
print(a > b)
tensor([[False, False, False],
        [ True,  True,  True]])
  • 大于等于
print(a >= b)
tensor([[True, True, True],
        [True, True, True]])
  • 小于
print(a < b)
tensor([[False, False, False],
        [False, False, False]])
  • 小于等于
print(a <= b)
tensor([[ True,  True,  True],
        [False, False, False]])
  • 等于
print(a == b)
tensor([[ True,  True,  True],
        [False, False, False]])
  • 不等于
print(a != b)
tensor([[False, False, False],
        [ True,  True,  True]])
  • 限制数据的上下限
print(a.clamp(2, 4))
tensor([[2.0000, 2.0000, 2.2000],
        [3.3000, 4.0000, 4.0000]])
  • 向下取整
print(a.floor())
tensor([[0., 1., 2.],
        [3., 4., 5.]])
  • 向上取整
print(a.ceil())
tensor([[0., 2., 3.],
        [4., 5., 6.]])
  • 四舍五入
print(a.round())
tensor([[0., 1., 2.],
        [3., 4., 6.]])
  • 求最小
print(a.min())
tensor(0.)
  • 求最大
print(a.max())
tensor(5.5000)
  • 求平均
print(a.mean())
tensor(2.7500)
  • 求积
print(a.prod())
tensor(0.)
  • 求和
print(a.sum())
tensor(16.5000)
  • 求最大值下标
print(a.argmax())
tensor(5)
  • 求最小值下标
print(a.argmin())
tensor(0)
  • 分维度求最大
print(a.max(dim=0))
torch.return_types.max(
values=tensor([3.3000, 4.4000, 5.5000]),
indices=tensor([1, 1, 1]))
  • 分维度求最大值下标
print(a.argmax(dim=0))
tensor([1, 1, 1])
  • 求1范数
print(a.norm(1))
print(a.norm(1, dim=0))
tensor(16.5000)
tensor([3.3000, 5.5000, 7.7000])
  • 求2范数
print(a.norm(2))
print(a.norm(2, dim=0))
tensor(8.1578)
tensor([3.3000, 4.5354, 5.9237])
  • 求前2个最小值
print(a.topk(2, dim=1, largest=False))
torch.return_types.topk(
values=tensor([[0.0000, 1.1000],
        [3.3000, 4.4000]]),
indices=tensor([[0, 1],
        [0, 1]]))
  • 求第2个小的值
a.kthvalue(2, dim=1)
torch.return_types.kthvalue(
values=tensor([1.1000, 4.4000]),
indices=tensor([1, 1]))

最后

感谢您的阅读,我是醉墨居士,希望对你有所帮助,也希望你能够使用PyTorch为你的未来开创更多可能性


http://www.kler.cn/a/464872.html

相关文章:

  • ros常用命令记录
  • 密钥管理系统在数据安全解决方案中的重要性
  • Kafka为什么快(高性能的原因)
  • 【C语言程序设计——循环程序设计】枚举法换硬币(头歌实践教学平台习题)【合集】
  • ACM算法模板
  • linux 软链接 快捷方式 详解
  • 制作一个类似ChatGPT的AI对话网站,模型能力使用ChatGPT
  • Pycharm访问 Redis 数据库
  • 语音识别基础算法——动态时间规整算法
  • 机器学习基础-卷积的计算
  • 全新免押租赁系统助力商品流通高效安全
  • 【大模型实战篇】LLaMA Factory微调ChatGLM-4-9B模型
  • 智能客户服务:科技如何重塑客户服务体验
  • IDEA2023.1修改默认Maven配置
  • 0基础跟德姆(dom)一起学AI 自然语言处理08-认识RNN模型
  • 如何在notepad++里面,修改注释颜色
  • 什么是区块链的“智能合约”
  • MySQL--》如何在SQL中巧妙运用函数与约束,优化数据处理与验证?
  • Oracle exp和imp命令导出导入dmp文件
  • RabbitMQ基础篇之Java客户端 基于注解声明队列交换机
  • 记录一下图像处理的基础知识
  • MBox20边缘计算网关助力各种数字化升级
  • windows C#-字符串和字符串字面量(四)
  • 【运维专题】大数据面试笔试宝典之大数据运维面试(一)
  • 多个DataV遍历生成
  • 【前端】Vue 3.5的SSR渲染优化与Lazy Hydration