Pytorch 张量操作 Python切片操作

这篇具有很好参考价值的文章主要介绍了Pytorch 张量操作 Python切片操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


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

一维张量定义

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

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

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

Pytorch 张量操作 Python切片操作

一维实例操作

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的特征图。切片操作如下:
Pytorch 张量操作 Python切片操作

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文章来源地址https://www.toymoban.com/news/detail-406776.html

到了这里,关于Pytorch 张量操作 Python切片操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【Pytorch】学习记录分享1——Tensor张量初始化与基本操作

    【Pytorch】学习记录分享1——Tensor张量初始化与基本操作

    1. 基础资料汇总 资料汇总 pytroch中文版本教程 PyTorch入门教程 B站强推!2023公认最通俗易懂的【PyTorch】教程,200集付费课程(附代码)人工智能_机器 视频 1.PyTorch简介 2.PyTorch环境搭建 basic: python numpy pandas pytroch theory: study mlp cnn transform rnn model: AlexNet VGG ResNet Yolo SSD 2. Tensor张量

    2024年02月04日
    浏览(15)
  • pytorch/tensorflow 直接给张量中的某个位置的值赋值,操作不可导。

    问题:给一个tensor A中[i,j],赋值p。直接操作 A[i,j]=p 可能会导致值覆盖,操作不可导。 解决方案:通过引入一个额外的mask实现。 ps: 没debug, 看起来是对的。 参考:https://github.com/hadjisma/VideoAlignment/blob/master/d2tw/smoothDTW.py#L44

    2024年02月10日
    浏览(8)
  • 从 X 入门Pytorch——Tensor的索引,切片,拼接,拆分,Reduction操作

    从 X 入门Pytorch——Tensor的索引,切片,拼接,拆分,Reduction操作

    本文参加新星计划人工智能(Pytorch)赛道: https://bbs.csdn.net/topics/613989052 承接上文:自己深度学习环境搭建和免费环境使用+Tensor构造+Tensor基本操作: 从 X 入门深度学习(Pytorch版本) 汇总: Name Out a[i, j, k, …] = a[i][j][k][…] 获取张量a的具体数据 a[start : end : step, start1 : end1 : step1

    2024年02月03日
    浏览(16)
  • Python的切片操作详细用法解析

    Python的切片操作详细用法解析

    在利用Python解决各种实际问题的过程中,经常会遇到从某个对象中抽取部分值的情况,切片操作正是专门用于完成这一操作的有力武器。理论上而言,只要条件表达式得当,可以通过单次或多次切片操作实现任意切取目标值。切片操作的基本语法比较简单,但如果不彻底搞清

    2024年02月02日
    浏览(13)
  • Python中的切片(Slice)操作详解

    Python中的切片(Slice)操作详解

    大家好,这里是果力成,话不多说,学之! 在python学习开发的过程中,我们难免会遇到从某个对象中抽取部分值的情况,对这种经常取指定索引的范围的操作,如果你使用循环的话是可以解决的,但是相对更好的方法而言,此操作是相当繁琐和费事的。 python中的 切片操作 正是专门用

    2024年02月01日
    浏览(10)
  • 关于pytorch张量维度转换及张量运算

    关于pytorch张量维度转换及张量运算

    view() 用于 改变张量的形状 ,但 不会改变张量中的元素值 。 用法1: 例如,你可以使用view 将一个形状是(2,3)的张量变换成(3,2)的张量; 上面的操作相当于,先把形状为**(2,3)的tensor展平,变成(1,6),然后再变成(3,2).** 用法2: 转换前后张量中的元素个数

    2024年02月06日
    浏览(10)
  • Python列表操作指南:索引、切片、遍历与综合应用

    列表(List)是Python中最常用的数据结构之一,它可以存储多个元素,并且支持对元素的索引和切片操作。本文将介绍列表的基本操作和常用方法。 通过方括号 [] 来创建一个列表,可以是空列表或包含元素的列表。例如: 列表中的元素按照插入顺序存储,并且每个元素都有一

    2024年02月09日
    浏览(16)
  • 梳理一下嵌入式和单片机之间的关系

    梳理一下嵌入式和单片机之间的关系

    一定有很多人都听说过嵌入式和单片机,但在刚开始接触时,不知道大家有没有听说过嵌入式就是单片机这样的说法,其实嵌入式和单片机还是有区别的。单片机与嵌入式到底有什么关系? 下面我们就来说说嵌入式和单片机之间的联系和区别吧。 01  什么是单片机? 首先,

    2024年02月04日
    浏览(15)
  • PyTorch核心--tensor 张量 !!

    文章目录 前言 张量的概念 1. 张量的定义 2. 张量的属性 3. 张量的形状 张量的原理 1. 存储(storage) 2. 形状(shape) 3. 步幅(stride) 张量的操作 1. 数学运算 2. 逻辑运算 3. 索引和切片 4. 形状操作 5. 广播 总结 在PyTorch中,张量是核心数据结构,它是一个多维数组,类似Numpy中

    2024年01月23日
    浏览(27)
  • PyTorch C++ 前端:张量

    PyTorch C++ 前端:张量

    本篇文章将尝试了解 PyTorch 组件的高级概述以及它们如何配合。 PyTorch 组件的高级概述 后端 PyTorch 后端是用 C++ 编写的,它提供 API 来访问高度优化的库,例如:用于高效矩阵运算的张量库、用于执行 GPU 运算的 CUDA 库以及用于梯度计算的自动微分等。 前端 可以使用 Python 或

    2024年02月07日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包