深入解析:PyTorch张量切片的陷阱:视图与副本

news/2025/9/27 9:10:10/文章来源:https://www.cnblogs.com/yxysuanfa/p/19114743

问题导入:

        在使用PyTorch框架开发中,你是否也也遇到过这样的问题,就是明明获取了张量的切片,却发现修改了原张量后,切片的结果也跟着变!

        我今天训练一个一个做下游mask完形填空任务的语言模型,

在书写整理函数是,我是这样写的:

然后正常训练模型

过程中发现我的训练指标一下就变得非常好看

损失值下降非常快,正确率可以用飙升来形容。

我觉得不可思议,所以决定把训练好的模型,去加载出来做测试

可是测试结果就是:

无论我预测什么句子,结果都是:

[MASK]

可问题出在哪里呢? 我检查了几遍代码,确定逻辑没有问题的,那为题出在哪??

没错!就是前面在获取正式标签时,没有做拷贝,只是用了切片。

一起看看看

使得模型训练时,只要将第16位置的值预测为[MASK]就可以将损失值降到最低,从而得到虚高的
训练指标,但是本质模型值学会了,预测为[MASK] ,任何句子都是将16位置预测为[MASK]

原因解析

这里我先写一段测试代码

import torch
arr =[
[1,2,3,4,5],
[4,5,6,7,8]
]
arr = torch.tensor(arr)
result = arr[:,3]
print(result)  # tensor([4,7])
arr[:,3]=8
print(result)  # tensor([8,8])

这里可以发现,改变原始张量,通过切片获取的值也发生了改变、

但是这时候,可能很多朋友们回想为什么?

直觉告诉我们result应该保存修改前的值[4,7],但实际输出却是修改后的值[8,8]。这与 Python 列表的行为截然不同:

在看看列表

# Python列表的行为
arr = [
[1,2,3,4,5],
[4,5,6,7,8]
]
result = [row[3] for row in arr]  # 列表推导式获取第3列
for row in arr:
row[3] = 8
print(result)  # 输出:[4, 7](保持原始值)

为什么会有这种差异?

答案就藏在 "视图" 与 "副本" 的区别中。

核心原理:视图(View)不是副本(Copy)

PyTorch 中,张量的切片操作返回的是视图(view) 而非副本(copy)

  • 视图:只是原张量数据的一个引用,不占用额外内存,与原张量共享同一块数据存储空间
  • 副本:是原数据的完整复制,占用独立的内存空间,与原张量互不影响

这种设计是为了提高计算效率 —— 在处理大型张量时,频繁复制数据会导致内存浪费和性能下降。PyTorch 默认采用视图方式,避免了不必要的数据复制。

在我们的例子中:

  1. result = arr[:,3]创建了一个视图,指向arr第 3 列的内存地址
  2. arr[:,3] = 8修改了这块内存中的值
  3. 因此result也会显示修改后的值

如何解决

获取真正的副本如果需要获取不受原张量影响的独立切片,可使用.clone()方法显式创建副本:

import torch
arr = torch.tensor([
[1,2,3,4,5],
[4,5,6,7,8]
])
result = arr[:,3].clone()  # 创建副本而非视图
arr[:,3] = 8
print(result)  # 输出:tensor([4, 7])(保持原始值)

.clone()会创建一个全新的张量,拥有独立的内存空间,后续对原张量的修改不会影响副本。

所以之前我的获取label值的代码应该改为:

总结:

哪些操作返回视图,哪些返回副本?

PyTorch 中常见的返回视图的操作:

  • 基本切片操作(如arr[:, 3]arr[1:3, :]
  • .view()方法(重塑张量形状)
  • .transpose().permute()(维度转换)

返回副本的操作:

  • .clone()(显式复制)
  • .detach()(在计算图中分离并复制)
  • 某些高级索引操作(如使用列表索引arr[[0,2], :]

注意:注意:高级索引(如arr[[0,1], [2,3]])通常返回副本,但具体行为可能因情况而异,建议通过.clone()确保获得副本。

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

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

相关文章

英语_阅读_Industry 4.0_待读

“Industry 4.0” is a mix of low-cost and high-power computers, high-speed communication and artificial intelligence. “工业4.0”是低成本高性能计算机、高速通信和人工智能的结合。 This will produce smart…

站酷网官网登录营销方案模板范文

在当今高度发达的制造业中,精密机械零件加工企业扮演着至关重要的角色,以其精湛的工艺和严谨的态度,为制造业的各个领域提供着关键的支撑。 一、高精度制造,奠定产品质量基础 精密机械零件加工企业以其精湛的加工技术,…

Python获取CPU和内存使用率

首先,确保已安装psutil库。如果尚未安装,请运行以下命令进行安装: pip install psutil 安装完成后,我们就可以使用psutil库来测量CPU和内存使用率了。以下是一个简单的示例代码: import psutil import timedef ge…

解决Python requests库POST请求参数顺序问题

在Python的世界里,用requests库发个POST请求也一样,有时候你得确保参数的顺序得守规矩,不然服务器可能理你都不理。那怎么保持POST请求参数的顺序呢?咱们得换个法子:用 collections.OrderedDict来拯救世界。 Orde…

使用Tabs选项卡组件快速搭建鸿蒙APP框架

ArkUI提供了很多布局组件,其中Tabs选项卡组件可以用于快速搭建鸿蒙APP框架,本文通过案例研究Tabs构建鸿蒙原生应用框架的方法和步骤。大家好,我是潘Sir,持续分享IT技术,帮你少走弯路。《鸿蒙应用开发从入门到项目…

深入解析:实战:基于 BRPC+Etcd 打造轻量级 RPC 服务——从注册到调用的核心架构与基础实现

深入解析:实战:基于 BRPC+Etcd 打造轻量级 RPC 服务——从注册到调用的核心架构与基础实现pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !impor…

完整教程:从另一个视角看Transformer:注意力机制就是可微分的k-NN算法

完整教程:从另一个视角看Transformer:注意力机制就是可微分的k-NN算法pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: …

哈尔滨电子网站建设个人建网站一般多少钱?

一、自动化测试基本介绍 1 自动化测试概述: 什么是自动化测试?一般说来所有能替代人工测试的方式都属于自动化测试,即通过工具和脚本来模拟人执行用例的过程。 2 自动化测试的作用 减少软件测试时间与成本改进软件质量通过扩大测试覆盖率…

ACM 杂题选做 题解合集

太困难QOJ #7509 01 Tree 翻转深度为奇数的点的颜色,将操作变为交换相邻的 \(\tt 0\) 点和 \(\tt 1\) 点。 对于每条边考虑,其施加操作的次数为 \(s\) 与 \(t\) 在其子树中 \(\tt 1\) 的个数差的绝对值。 所以对于串…

| 和 || 的区别详解及应用场景对比

|与||的区别 在众多编程语言中,|与||代表了不同的运算。其中|是按位或运算,||是逻辑或运算。 从字面意思来理解,|常可以用于具体数值的计算,结果为数值,而||是用来逻辑运算的,结果只有False或者True。例如: int…

准备建网站该怎么做网站改版对优化的影响

buffer busy waitshttp://metalink.oracle.com/metalink/plsql/ml2_documents.showDocument?p_database_idNOT&p_id34405.1当会话想要访问缓冲存储器中的数据块,而该数据块正在被其它会话使用时产生buffer busywaits事件。其它会话可能正在从数据文件向缓冲区存…

网站分成推广怎么做西部数码wordpress

我有一个带有OAuth2授权和资源服务器的spring boot设置.用户可以通过向/ oauth / token发出POST请求来获取令牌.到现在为止还挺好.但是,我不想通过BASIC auth保护/ oauth / token,而是通过自定义安全过滤器.我尝试了以下内容,但从未调用过DemoAuthenticationFilter:…

伊春网络建站公司网络营销的方式有哪些

https://docs.nvidia.com/cuda/wsl-user-guide/index.html 这个写的很详细

Kubernetes技巧:使用Prometheus监控Pod性能指标

监控Kubernetes集群中的Pod性能是确保应用健康和高效的关键。Prometheus是一个开源的监控和警报工具,被广泛用于收集和存储Kubernetes集群的性能指标。现在,我们就来探索如何使用Prometheus以一个有趣且形象的方式来…

全国网站建设开发公司网签物料

背景 git bash默认字体太小了,每次读信息都要伸头盯着屏幕,很不自在,不符合我的风格,so let’s do it! 修改前的git bash: 正确的打开方式 1、在任意目录下,右键选择“Git Bash Here”&…

如何加强校园网站建设高端网站制作软件

进程间通信机制(IPC) 简述 IPC:Inter Process Communication 进程和进程之间的用户空间相互独立,但是4G内核空间共享,进程间的通信就是通过这4G的内核空间 分类 传统的进程间通信机制 无名管道(pipe) 有名管道&…

2025.9.27——1橙

普及- P2430 严酷的训练 题目描述的乱七八糟的,实际上就是一个简单的背包。

深入解析:Python实现蝗虫优化算法(Grasshopper Optimization Algorithm, GOA)(附完整代码)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

提升网站转化率西海岸新区城市建设局公示网站

1、Stream 概述 Java 8 引入了 Stream API,它是一种用于简化集合和数组操作的强大工具。Stream API 允许我们将集合或数组视为流,并在流上进行各种操作,如筛选、排序、聚合等。 Stream API 的核心概念是 Stream 流,它代表了一个数据流,其中包含了一系列的元素。这些元素…

知名网站定制报价网页前端设计包括哪些内容

一、计算机简介: 1、计算机系统组成:软件和硬件,二者紧密相关,缺一不可 1.1硬件:计算机系统的物质基础,软件的载体 1.1.1硬件系统:主机(中央处理器(CPU,一般CPU由计算器和…