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

【新手向】PyTorch常用Tensor shape变换方法

【新手向】PyTorch常用Tensor shape变换方法

前言

B站UP主科研水神大队长的视频中介绍了“缝合模块”大法,其中专门强调了“深度学习 玩的就是shape”。受此启发,专门整理能够调整tensor形状的几个内置函数,方便以后更好地调整PyTorch代码中的模型结构。

squeeze, unsqueeze

  • torch.squeeze()
  • torch.unsqueeze()

squeeze()用于压缩掉指定的维度,这个维度的取值必须是1,否则无效。unsqueeze()用于在指定的位置增加一个维度。

代码实例:

import torch# image
x1 = torch.ones([4, 3, 256, 256]) # batch_size, channels, height, width
print("x1.shape:", x1.shape) # x1.shape: torch.Size([4, 3, 256, 256])x2 = torch.ones([1, 1, 3])
print("x2.shape:", x2.shape) # x2.shape: torch.Size([1, 1, 3])y1 = x1.squeeze(0)
print("y1.shape:", y1.shape) # y1.shape: torch.Size([4, 3, 256, 256])y2 = x2.squeeze(0)
print("y2.shape:", y2.shape) # y2.shape: torch.Size([1, 3])y6 = x2.squeeze(1)
print("y6.shape:", y6.shape) # y6.shape: torch.Size([1, 3])y7 = x2.squeeze(-1)
print("y7.shape:", y7.shape) # y7.shape: torch.Size([1, 1, 3])y3 = x1.unsqueeze(0)
print("y3.shape:", y3.shape) # y3.shape: torch.Size([1, 4, 3, 256, 256])y4 = x1.unsqueeze(1)
print("y4.shape:", y4.shape) # y4.shape: torch.Size([4, 1, 3, 256, 256])y5 = x1.unsqueeze(-1)
print("y5.shape:", y5.shape) # y5.shape: torch.Size([4, 3, 256, 256, 1])

transpose

transpose()用于调整tensor的维度顺序,在计算机视觉的任务中经常需要调整通道顺序,比如有的模型输出的顺序是(channel, height, width),而有的输出顺序是(height, width, channel),需要通过调换顺序来匹配输入输出。

transpose()有两种用法:

  • torch.transpose()
  • x.transpose()

代码实例:

import torchx1 = torch.ones([4, 3, 256, 256]) # batch_size, channels, height, width
print("x1.shape:", x1.shape) # x1.shape: torch.Size([4, 3, 256, 256])x2 = torch.ones([1, 1, 3])
print("x2.shape:", x2.shape) # x2.shape: torch.Size([1, 1, 3])trans1 = torch.transpose(x1, 0, 1)
print("trans1.shape:", trans1.shape) # trans1.shape: torch.Size([3, 4, 256, 256])trans2 = torch.transpose(x2, 1, 2)
print("trans2.shape:", trans2.shape) # trans2.shape: torch.Size([1, 3, 1])trans3 = x1.transpose(0, 1)
print("trans3.shape:", trans3.shape) # trans3.shape: torch.Size([3, 4, 256, 256])

reshape

reshape()能够在总元素数量不产生变化的前提下改变tensor的形状。它也可以用于处理numpy array的形状。

代码实例:

import torch
import numpy as npx3 = torch.Tensor([1, 2, 3, 4, 5, 6])
print("x3.shape:", x3.shape) # x3.shape: torch.Size([6])reshape1 = x3.reshape(2, 3)
print("reshape1.shape:", reshape1.shape) # reshape1.shape: torch.Size([2, 3])x4 = torch.ones([4, 4, 3, 256, 256])
print("x4.shape:", x4.shape) # x4.shape: torch.Size([4, 4, 3, 256, 256])reshape2 = x4.reshape(4*4, 3, 256, 256)
print("reshape2.shape:", reshape2.shape) # reshape2.shape: torch.Size([16, 3, 256, 256])x5 = np.array([1, 2, 3, 4, 5, 6])
print("x5.shape:", x5.shape) # x5.shape: (6,)reshape3 = x5.reshape(2, 3)
print("reshape3.shape:", reshape3.shape) # reshape3.shape: (2, 3)

view

view()的作用与reshape()的作用相似,也是在总元素数量不产生变化的前提下改变形状,但view()只能对张量进行操作。

代码实例:

import torchx3 = torch.Tensor([1, 2, 3, 4, 5, 6])
print("x3.shape:", x3.shape) # x3.shape: torch.Size([6])view1 = x3.view(2, 3)
print("view1.shape:", view1.shape) # view1.shape: torch.Size([2, 3])
print("view1:", view1)
# view1: tensor([[1., 2., 3.],
#         [4., 5., 6.]])view2 = x3.view(3, 2)
print("view2.shape:", view2.shape) # view2.shape: torch.Size([3, 2])
print("view2:", view2) 
# view2: tensor([[1., 2.],
#         [3., 4.],
#         [5., 6.]])

permute

permute()用于调整维度的顺序。与transpose()一次仅能“对调”两个维度的顺序不同,permute()可以一次调整多个维度的顺序。

代码实例:

import torchx4 = torch.ones([4, 4, 3, 256, 256])
print("x4.shape:", x4.shape) # x4.shape: torch.Size([4, 4, 3, 256, 256])permute1 = x4.permute(1, 3, 4, 0, 2)
print("permute1.shape:", permute1.shape) # permute1.shape: torch.Size([4, 256, 256, 4, 3])
http://www.lryc.cn/news/594076.html

相关文章:

  • C++ STL中迭代器学习笔记
  • Python爬虫实战:研究Genius库相关技术
  • TVLT:无文本视觉-语言Transformer
  • 【设计模式C#】享元模式(用于解决多次创建对象而导致的性能问题)
  • 第十四讲 | AVL树实现
  • [simdjson] `error_code` | .get() | 异常 | is_fatal() | current_location() | 链式处理
  • 苍穹外卖|项目日记(完工总结)
  • 【JS逆向基础】数据库之mysql
  • pip关于缓存的用法
  • Ubuntu挂载和取消挂载
  • 开源安全大模型Foundation-Sec 8B的安全实践
  • PPT科研画图插件
  • 如何使用Python将任意PPT变为“智能模板”(解决 python-pptx 替换元素无法保留格式的问题,阴影、填充等属性保留!)
  • 深度学习篇---矩阵
  • 深度学习图像分类数据集—百种病虫害分类
  • linux + 宝塔面板 部署 django网站 启动方式:uwsgi 和gunicorn如何选择 ?
  • k8s:离线部署存在的相关问题
  • day 30 打卡
  • Redis 详解:从入门到进阶
  • MySQL 配置性能优化实操指南:分版本5.7和8.0适配方案
  • 【Anaconda】Conda 虚拟环境打包迁移教程
  • Redis通用常见命令(含面试题)
  • 28.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--币种服务(二)
  • 零基础学习性能测试第二章-linux/jvm/mysql等数据收集环境搭建
  • Feign远程调用
  • 在Ubuntu22系统上离线部署ai-infra-guard教程【亲测成功】
  • 【成品设计】基于STM32的宠物检测系统
  • ubuntu-linux-pycharm-社区版安装与django配置
  • 数据结构自学Days10 -- 二叉树的常用实现
  • 基于Chinese-LLaMA-Alpaca-3的多模态中医舌诊辅助诊断系统设计与实现