Pytorch 张量操作 Python切片操作

news2024/10/7 12:21:56

目录

  • 一维张量定义
  • 一维实例操作
  • 二维张量操作
    • 张量拼接-注意需要拼接的维度一定要相同
    • 广播机制
  • 更高维的演示
  • 总结
  • YOLOv5 Focus样例
  • 参考

梳理一下Pytorch的张量切片操作

一维张量定义

一维向量的操作其实很像numpy一维数组,基本定义如下:
1.默认步长为1

2.起始索引:结束索引 是一个**左闭右开区[)**间,即结束索引的值不取

3.有反向索引,具体如下:
[起始索引:结束索引:步长]

在这里插入图片描述

一维实例操作

import torch
# 创建一个行向量
x=torch.arange(12)
x
#tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
x[-1]
#tensor(11)
x[0]
#tensor(0)
x[0:11:2]
# [起始0:末尾12:步长2](左闭右开)
x[:12:2]
#Out[23]: tensor([ 0,  2,  4,  6,  8, 10])
x[1:12:2]
#Out[24]: tensor([ 1,  3,  5,  7,  9, 11])
x[-4:-1]
#Out[25]: tensor([ 8,  9, 10])
# 取倒数第4-倒数第1(左闭右开)
x[-4:]
#Out[26]: tensor([ 8,  9, 10, 11])
# 5.(注意)pytorch不支持反向获取序列
#注意理解前面的反向索引,反向索引也要正向读取,比如x[-1:-3]也是不行的
# 默认区间
x[:]
x[::]
x[::1]
#以上三种输出都一样: tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

二维张量操作

对于一维向量而言,操作使用冒号:,而对于多维张量,维度与维度之间区分使用逗号,比如对二维张量,x[ , ]。为避免混乱,以下用二维张量演示,可以理解为矩阵。

x=torch.arange(12)
x=x.reshape(3,4)
x=x.reshape(3,-1)#-1 表示自动调整 类似未知数x 3 * x=12  x=4
#tensor([[ 0,  1,  2,  3],
#        [ 4,  5,  6,  7],
#        [ 8,  9, 10, 11]])
# 获得张量中元素的总数
x.numel()
#Out[7]: 12
x[0]
#tensor([0, 1, 2, 3])
x[1:2] #[左闭右开] 相当于x[1]
#tensor([[4, 5, 6, 7]])
x[1]
#tensor([[4, 5, 6, 7]])

# 没有逗号,在第一维度dim=0操作
x[1:3]
#tensor([[ 4,  5,  6,  7],
#        [ 8,  9, 10, 11]])
# 将[1:3)行的元素全部换成5
x[1:3]=5
#tensor([[0, 1, 2, 3],
#        [5, 5, 5, 5],
#       [5, 5, 5, 5]])


# 有逗号,在dim=0和dim=1上分别操作
# 先取[0:2)行,列上默认(即全选)
x[0:2,:]
#tensor([[0, 1, 2, 3],
#        [4, 5, 6, 7]])
#有逗号,按照逗号区分维度间的操作
x[1]
#Out[13]: tensor([4, 5, 6, 7])
x[1,3] #先取第一个维度 再取第一个维度中编号为3的
#Out[15]: tensor(7)

# 有逗号,在dim=0和dim=1上分别操作
x[1:3]
#tensor([[ 4,  5,  6,  7],
#        [ 8,  9, 10, 11]])
# 先取[1:3)行,在此基础上取[2:4)列
x[1:3,2:4]
#tensor([[ 6,  7],
#        [10, 11]])

# 有逗号,在dim=0和dim=1上分别操作
# 先取[0:2)行,列上默认(即全选)
x[0:2,:]
tensor([[0, 1, 2, 3],
        [4, 5, 6, 7]])
        
# 有逗号,在dim=0和dim=1上分别操作
# 行上默认,列取[-3,-1)列
x
# tensor([[ 0,  1,  2,  3],
#    [ 4,  5,  6,  7],
#    [ 8,  9, 10, 11]])
x[:,-3:-1]
#tensor([[ 1,  2],
#        [ 5,  6],
#        [ 9, 10]])

#...的用法:相当于这一维度默认
x[1:...]
#tensor([4, 5, 6, 7])

张量拼接-注意需要拼接的维度一定要相同

# 张量连结
X=torch.arange(12,dtype=torch.float32).reshape((3,4))
#tensor([[ 0.,  1.,  2.,  3.],
#        [ 4.,  5.,  6.,  7.],
#        [ 8.,  9., 10., 11.]])
Y=torch.tensor([[2.0,1,4,3],[1,2,3,4],[4,3,2,1]])
Y.shape
#torch.Size([3, 4])

torch.cat((X,Y),dim=0)#按行拼接
#tensor([[ 0.,  1.,  2.,  3.],
#        [ 4.,  5.,  6.,  7.],
#        [ 8.,  9., 10., 11.],
#        [ 2.,  1.,  4.,  3.],
#        [ 1.,  2.,  3.,  4.],
#        [ 4.,  3.,  2.,  1.]])
torch.cat((X,Y),dim=1)#按列拼接
#tensor([[ 0.,  1.,  2.,  3.,  2.,  1.,  4.,  3.],
#        [ 4.,  5.,  6.,  7.,  1.,  2.,  3.,  4.],
#        [ 8.,  9., 10., 11.,  4.,  3.,  2.,  1.]])

广播机制

a=torch.arange(3).reshape((3,1))
b=torch.arange(2).reshape((1,2))
a,b
#(tensor([[0],
#         [1],
#         [2]]),
# tensor([[0, 1]]))

# a,b都会先变成3×2矩阵再相加
a变成
# tensor([[0],[0]
#         [1],[1]
#         [2],[2]])
b变成
# tensor([[0, 1]
#         [0, 1]
#         [0, 1]])
a+b
#tensor([[0, 1],
#        [1, 2],
#        [2, 3]])

更高维的演示

# 先随机生成一个三维张量
x=torch.rand(4,3,5)

x

tensor([[[0.3699, 0.1947, 0.6766, 0.5857, 0.2937],
         [0.2248, 0.6221, 0.1842, 0.2236, 0.4396],
         [0.2535, 0.6115, 0.8398, 0.5736, 0.2702]],
 
        [[0.6308, 0.1010, 0.0042, 0.5904, 0.2101],
         [0.7639, 0.8016, 0.8733, 0.4037, 0.7373],
         [0.1602, 0.9687, 0.0013, 0.2576, 0.6159]],
 
        [[0.2155, 0.2485, 0.9657, 0.4890, 0.0394],
         [0.8007, 0.6122, 0.2834, 0.7095, 0.9711],
         [0.5180, 0.8917, 0.0647, 0.6129, 0.7661]],
 
        [[0.9430, 0.1931, 0.3349, 0.0188, 0.1079],
         [0.1710, 0.2816, 0.2003, 0.3089, 0.1025],
         [0.1610, 0.9168, 0.7699, 0.4525, 0.4716]]])

x[:2,:,2:]

# 取第一维度[0:2),第二维度默认(全取),第三维度[2:]
tensor([[[0.6766, 0.5857, 0.2937],
         [0.1842, 0.2236, 0.4396],
         [0.8398, 0.5736, 0.2702]],
 
        [[0.0042, 0.5904, 0.2101],
         [0.8733, 0.4037, 0.7373],
         [0.0013, 0.2576, 0.6159]]])

x[:-2,:,:2]

# 取第一维度[:-2),第二维度默认(全取),第三维度【:2)
x[:-2,:,:2] #  正数最后一行表示-1 ,x[:-2]表示取第一行到倒数第三行
tensor([[[0.3699, 0.1947],
         [0.2248, 0.6221],
         [0.2535, 0.6115]],
 
        [[0.6308, 0.1010],
         [0.7639, 0.8016],
         [0.1602, 0.9687]]])

x[:2,:,0:5:2]

# 取第一维度[:2),第二维度默认(全取),第三维度【0:5:2】
x[:2,:,0:5:2]
tensor([[[0.3699, 0.6766, 0.2937],
         [0.2248, 0.1842, 0.4396],
         [0.2535, 0.8398, 0.2702]],
 
        [[0.6308, 0.0042, 0.2101],
         [0.7639, 0.8733, 0.7373],
         [0.1602, 0.0013, 0.6159]]])

总结

根据逗号,来区分在哪一维度操作,根据冒号:来看这一维度的切片操作

把握这一句话,然后记住如果是默认那这一维全选就可以了。一般深度学习不会用到五维及以上,所以重点把握三维的各类变换就可以了。

YOLOv5 Focus样例

以yolov5s为例,原始的640 × 640 × 3的图像输入Focus结构,采用切片操作,先变成320 × 320 × 12的特征图,再经过一次卷积操作,最终变成320 × 320 × 32的特征图。切片操作如下:
在这里插入图片描述

class Focus(nn.Module):
    # Focus wh information into c-space
    def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True):  # ch_in, ch_out, kernel, stride, padding, groups
        super(Focus, self).__init__()
        self.conv = Conv(c1 * 4, c2, k, s, p, g, act)      # 这里输入通道变成了4倍

    def forward(self, x):  # x(b,c,w,h) -> y(b,4c,w/2,h/2)
        return self.conv(torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1))

还不能理解的可以看看这个例子,使用三维的向量,batch维度省略。
x[…, ::2, ::2]这个省略号包括了batch和c两个维度的信息。

x=torch.rand(3,4,4)
x
tensor([[[0.2714, 0.7606, 0.6511, 0.8788],
         [0.6301, 0.5507, 0.7287, 0.5045],
         [0.6113, 0.1180, 0.6528, 0.0742],
         [0.6379, 0.2739, 0.9225, 0.1339]],
        [[0.9664, 0.0526, 0.2381, 0.2231],
         [0.6880, 0.0968, 0.8737, 0.8241],
         [0.8350, 0.7764, 0.9478, 0.2668],
         [0.8064, 0.5715, 0.4565, 0.1793]],
        [[0.1113, 0.9371, 0.3895, 0.4529],
         [0.7409, 0.0787, 0.0074, 0.7480],
         [0.7354, 0.7157, 0.3509, 0.5387],
         [0.2367, 0.2797, 0.8791, 0.9865]]])

x[…, ::2, ::2] #取每个维度的13行 ,再取13列

tensor([[[0.2714, 0.6511],
         [0.6113, 0.6528]],
        [[0.9664, 0.2381],
         [0.8350, 0.9478]],
        [[0.1113, 0.3895],
         [0.7354, 0.3509]]])

x[…, ::2, 1::2]#取每个维度的13行,再取24列

tensor([[[0.7606, 0.8788],
         [0.1180, 0.0742]],
        [[0.0526, 0.2231],
         [0.7764, 0.2668]],
        [[0.9371, 0.4529],
         [0.7157, 0.5387]]])

x[…, 1::2, ::2] #取每个维度的24行再取每个维度的13列

tensor([[[0.6301, 0.7287],
         [0.6379, 0.9225]],
        [[0.6880, 0.8737],
         [0.8064, 0.4565]],
        [[0.7409, 0.0074],
         [0.2367, 0.8791]]])

x[…, 1::2,1 ::2] #取每个维度的24行再取每个维度的24列

tensor([[[0.5507, 0.5045],
         [0.2739, 0.1339]],
        [[0.0968, 0.8241],
         [0.5715, 0.1793]],
        [[0.0787, 0.7480],
         [0.2797, 0.9865]]])

参考

Pytorch张量基本、切片操作总结
https://blog.csdn.net/weixin_53111016/article/details/124866683

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/416000.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HotSpot经典垃圾收集器

虽然垃圾收集器的技术在不断进步,但直到现在还没最好的收集器出现,更加不存在“万能”的收集器,所以我们选择的只是对具体应用最合适的收集器。 图 HotSpot中的垃圾收集器,连线表示可搭配使用 1 Serial收集器 是最基础、历史最悠…

第08章_面向对象编程(高级)

第08章_面向对象编程(高级) 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 本章专题与脉络 1. 关键字:static 回顾类中的实例变量(即非static的成员变量) c…

linux文件类型和根目录结构

目录 一、Linux文件类型 二、Linux系统的目录结构 1. FHS 2. 路径以及工作目录 (1)路径 (2)工作目录 一、Linux文件类型 使用ls -l命令查看到的第一个字符文件类型说明-普通文件类似于Windows的记事本d目录文件类似于Windo…

【GPT4】GPT4 创作郭德纲姜昆相声作品的比较研究

欢迎关注【youcans的 AIGC 学习笔记】原创作品 说明:本文附录内容由 youcans 与 GPT-4 共同创作。 【GPT4】GPT4 创作郭德纲姜昆相声作品的比较研究研究总结0. 背景1. 对 GPT4 创作的第 1 段相声的分析2. 对GPT4 创作的第 2 段相声的分析3. 对GPT4 创作的第 3 段相…

Window常用命令

一、快捷键 1、自带快捷键 序号快捷键作用1windowsGXBOX录屏2cmd >osk屏幕键盘3cmd >calc计算器4cmd >mrt恶意软件删除工具 2、浏览器快捷键 序号快捷键作用1Alt P浏览器图片下载(来自油猴脚本) 二、其他功能 1、解决端口占用 第一步&…

Linux安装单细胞分析软件copykat

Linux安装单细胞分析软件copykat 测试环境 Linux centos 7R 4.1.2minconda3天意云24C192GB安装步骤 新建环境 conda activate copykatconda install r-base4.1.2 安装基础软件 checkPkg <- function(pkg){return(requireNamespace(pkg, quietly TRUE))}if(!checkPkg("…

类的加载过程-过程二:Linking阶段

链接过程之验证阶段(Verification) 当类加载到系统后&#xff0c;就开始链接操作&#xff0c;验证是链接操作的第一步。 它的目的是保证加载的字节码是合法、合理并符合规范的。 验证的步骤比较复杂&#xff0c;实际要验证的项目也很繁多&#xff0c;大体上Java虚拟机需要做…

基于stable diffusion的艺术操作

下面是作者基于stable diffusion的艺术操作 得益于人工智能的强大技术 以下所有的图 绝对是整体星球上唯一的图 现在人工智能越来越强大&#xff0c;感觉将来最有可能取代的就是摄影师、中低级的程序员、UI设计师、数据分析师等&#xff0c;人们未来更多从事的职业应该是快速…

机器学习 01

目录 一、机器学习 二、机器学习工作流程 2.1 获取数据 2.2 数据集 2.2.1 数据类型构成 2.2.2 数据分割 2.3 数据基本处理 2.4 特征工程 2.4.1什么是特征工程 2.4.2 为什么需要特征工程(Feature Engineering) 2.4.3 特征工程内容 2.5 机器学习 2.6 模型评估 2.7 …

【消息队列】细说Kafka消费者的分区分配和重平衡

消费方式 我们直到在性能设计中异步模式&#xff0c;一般要么是采用pull&#xff0c;要么采用push。而两种方式各有优缺点。 pull &#xff1a;说白了就是通过消费端进行主动拉去数据&#xff0c;会根据自身系统处理能力去获取消息&#xff0c;上有Broker系统无需关注消费端的…

Windows GPU版本的深度学习环境安装

本文记录了cuda、cuDNN的安装配置。 参考文章&#xff1a; cuda-installation-guide-microsoft-windows 12.1 documentation Installation Guide :: NVIDIA cuDNN Documentation 一、cuda安装 注意事项&#xff1a; 1、cuda安装最重要的是查看自己应该安装的版本。 表格…

Java数组打印的几种方式

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

独立看门狗(IWDG)实验

独立看门狗简介 单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环&#xff0c; 看门狗电路就是为了避免这种情况的发生 。IWDG&#xff08;Independent watchdog&#xff09;独立看门狗&#xff0c;可以用来检测并解决由于软件错误导致的故障&#xff0c;当计数器…

使用 ArcGIS Pro 进行土地利用分类的机器学习和深度学习

随着技术进步&#xff0c;尤其是地理信息系统 (GIS)工具的进步&#xff0c;可以更有效地对土地利用进行分类。分类的使用可用于识别植被覆盖变化、非法采矿区和植被抑制区域&#xff0c;这些只是土地利用分类的众多示例中的一部分。 分类的一大困难是确定要解决的问题的级别。…

MongoDB 聚合管道中使用数组表达式运算符断言数组($isArray)

数组表达式运算符主要用于文档中数组的操作&#xff0c;接上一篇&#xff1a; MongoDB 聚合管道中使用数组表达式运算符&#xff08;$concatArrays合并数组&#xff09;https://blog.csdn.net/m1729339749/article/details/130162048本篇我们主要介绍数组表达式运算符中用于断…

在windows上安装部署cicd

安装步骤 下载gitlab-runner&#xff0c;官网地址如下&#xff1a; https://docs.gitlab.com/runner/install/windows.html在任意位置创建文件夹&#xff0c;并把安装程序放入文件夹中 安装gitlab-runner 注意需要使用管理员权限&#xff0c;打开powershell才能运行 cd C:\Gi…

多智能体深度强化学习在移动边缘计算的联合多通道访问和任务卸载中的应用

多智能体深度强化学习在移动边缘计算的联合多通道访问和任务卸载中的应用主要贡献与相关工作比较的贡献三、系统模型&#xff08;only 2 pages&#xff09;3.1 网络模型3.2 通信模型3.3 计算模型3.3.1 本地计算3.3.2 卸载计算四、预备知识&#xff08;only 1 page&#xff09;五…

Autosar COM Stack系列介绍01_一文看懂各层PDU

本文框架1. 概述1.1 缩写2. OSI模型在Autosar中应用3. 各层PDU介绍3.1 L-PDU3.2 N-PDU3.2.1 N_AI3.2.2 N_PCI3.3 I-PDU1. 概述 在学习Autosar通信栈时中会遇到关于PDU的各种缩写&#xff0c;例如&#xff0c;L-PDU&#xff0c;N-PDU&#xff0c;I-PDU还有SDU等&#xff0c;它们…

Kafka3.0.0版本——生产者自定义分区器

目录一、生产者自定义分区器代码示例1.1、自定义分区器类1.2、生产者发送消息代码&#xff08;生产者的配置中添加分区器参数&#xff09;1.3、测试一、生产者自定义分区器代码示例 1.1、自定义分区器类 代码 package com.xz.kafka.producer;import org.apache.kafka.clients.…

Web API学习笔记1(DOM学习)

一、API 和 web API 1API API —— 应用程序编程接口&#xff0c;是给程序员提供的一种工具&#xff0c;以便能更轻松的实现想要完成的功能。可以比作为充电接口 2.Web API 是浏览器提供的一套操作浏览器功能和页面元素的API&#xff08;BOM和DOM&#xff09;&#xff0c;主…