news 2026/10/27 1:14:38

Pytorch基础:Tensor的连续性

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Pytorch基础:Tensor的连续性

相关阅读

Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm=1001.2014.3001.5482


在Pytorch中,一个连续的张量指的是张量中各数据元素在底层的存储顺序与其在张量中的位置一致。这意味着每一个元素的地址可以通过下面的线性映射公式来确定:

其中,是第k维的索引,是第维的步长(就是第维的数据在存储时,相邻数据在底层线性存储时相隔的数据数),是张量底层数据存储的起始地址。

对于一个连续的张量,其应该符合从最内层维度(第0维度)到最外层维度递减的模式。更准确地说,如果一个张量有个维度,并且每个维度的大小是,那么其连续性可以使用下面的方式判定:

当你创建一个新的张量时,默认情况下,它是连续的,这意味着它的元素在内存中是按照顺序存储的。可以通过size()方法和stride()方法获得一个张量的形状和步长,利用公式判断是否连续;也可以使用storage()方法,直接获得一个张量在底层的线性存储结果;最方便的是使用.is_contiguous()方法,他会直接返回一个布尔值。

import torch x = torch.tensor([[1, 2], [3, 4]]) print(list(x.size())) print(x.stride()) print(x.storage()) print("Is x contiguous?", x.is_contiguous()) 输出: [2, 2] (2, 1) 1 2 3 4 [torch.LongStorage of size 4] Is x contiguous? True

为什么会出现非连续张量呢?在PyTorch中,非连续张量的出现往往与张量视图(tensor views)的概念密切相关。张量视图允许一个新张量作为原张量的视图存在,其中新张量与其原张量共享相同的底层数据。这种设计旨在避免显式的数据复制,从而实现快速且内存高效的操作(例如切片、转置)。

既然两个不同的张量共享底层存储,如果其中一个张量是连续的,另一个必然是不连续的。

import torch x = torch.tensor([[1, 2], [3, 4]]) print(list(x.size())) print(x.stride()) print(x.storage()) print("Is x contiguous?", x.is_contiguous()) y = x.t() print(list(y.size())) print(y.stride()) print(y.storage()) print("Is y contiguous?", y.is_contiguous()) 输出: [2, 2] (2, 1) 1 2 3 4 [torch.LongStorage of size 4] Is x contiguous? True [2, 2] (1, 2) 1 2 3 4 [torch.LongStorage of size 4] Is y contiguous? False

除了t(),Pytorch中有下面这些会返回视图的操作(因此可能出现非连续张量)。

基本的切片和索引, 例如tensor[0, 2:, 1:7:2] adjoint() as_strided() detach() diagonal() expand() expand_as() movedim() narrow() permute() select() squeeze() transpose() t() T H mT mH real imag view_as_real() unflatten() unfold() unsqueeze() view() view_as() unbind() split() hsplit() vsplit() tensor_split() split_with_sizes() swapaxes() swapdims() chunk() indices() (仅限稀疏张量) values() (仅限稀疏张量)

除此之外,reshape(),reshape_as()和flatten() 既有可能返回张量的视图,也可能返回一个拥有独立存储空间的新张量。这取决于一些特定的条件,具体可见关于这些操作的文章。

Pytorch基础:Tensor的reshape方法https://chenzhang.blog.csdn.net/article/details/133445832Pytorch基础:Tensor的flatten方法https://chenzhang.blog.csdn.net/article/details/136570774最后值得一提的是,contiguous()方法能返回一个连续的张量,如果原张量已连续,则会返回原张量。

import torch x = torch.tensor([[1, 2], [3, 4]]) print(list(x.size())) print(x.stride()) print(x.storage()) print("Is x contiguous?", x.is_contiguous()) y = x.t() z = y.contiguous() print(list(z.size())) print(z.stride()) print(z.storage()) print("Is z contiguous?", z.is_contiguous()) 输出: [2, 2] (2, 1) 1 2 3 4 [torch.LongStorage of size 4] Is x contiguous? True [2, 2] (2, 1) 1 3 2 4 [torch.LongStorage of size 4] Is z contiguous? True
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/27 1:14:38

基于 YOLO V10 Fine-Tuning 训练自定义的目标检测模型

一、YOLO V10 在本专栏的前面几篇文章中,我们使用 ultralytics 公司开源发布的 YOLO-V8 模型,分别 Fine-Tuning 实验了 目标检测、关键点检测、分类 任务,实验后发现效果都非常的不错,但它已经不是最强的了。最新的 YOLO-V10 已经…

作者头像 李华
网站建设 2026/10/27 1:14:19

Sentinel Dashboard 规则联动持久化方案

一、Sentinel Dashboard 规则联动持久化方案 Sentinel 是阿里开源的一个流量控制组件,它提供了一种流量控制、熔断降级、系统负载保护等功能的解决方案。并且我们通过 Sentinel Dashboard 可以非常便捷的添加或修改规则策略,但是如果细心的小伙伴应该可以…

作者头像 李华
网站建设 2026/10/27 1:14:15

常见的文件系统

NTFS (New Technology File System)开发者: 微软(1993年)用途: 主要用于 Windows 操作系统详细介绍:1. 历史背景与演变NTFS(New Technology File System)是微软在1993年随Windows NT 3.1推出的一…

作者头像 李华
网站建设 2026/10/27 1:13:24

Verilog基础:编译指令`timescale

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 timescale编译指令用于指定该指令后编译单元内的模块的时间单位和时间精度,直到在编译单元中遇到了另一个timescale编译指令(关于编译单元…

作者头像 李华
网站建设 2026/10/27 1:12:43

ArmNN : Fronted model to ComputeLibrary OpenCL model

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华