为深度学习创建PyTorch张量 - 最佳选项
为深度学习创建PyTorch张量 - 最佳选项
正如我们所看到的,PyTorch张量是torch.Tensor
PyTorch类的实例。张量的抽象概念与PyTorch张量之间的区别在于,PyTorch张量为我们提供了一个可以在代码中操作的具体实现。
在上一篇文章中,我们看到了如何使用数据(如Python列表、序列和NumPy ndarrays)在PyTorch中创建张量。给定一个numpy.ndarray
,我们发现有四种方法可以创建一个torch.Tensor
对象。
这里是一个快速回顾:
> data = np.array([1,2,3])
> type(data)
numpy.ndarray> o1 = torch.Tensor(data)
> o2 = torch.tensor(data)
> o3 = torch.as_tensor(data)
> o4 = torch.from_numpy(data)
> print(o1)
tensor([1., 2., 3.])
> print(o2)
tensor([1, 2, 3], dtype=torch.int32)
> print(o3)
tensor([1, 2, 3], dtype=torch.int32)
> print(o4)
tensor([1, 2, 3], dtype=torch.int32)
我们在这篇文章中的任务是探索这些选项之间的区别,并为我们创建张量的需求提出最佳选项。
不同系统上的Numpy dtype
行为
根据你的机器和操作系统,你的dtype
可能与这里和视频中显示的不同。
Numpy根据它是在32位还是64位系统上运行来设置其默认dtype
,并且在Windows系统上的行为也有所不同。
这个链接提供了关于在Windows系统上看到的差异的更多信息。受影响的方法是:tensor
、as_tensor
和from_numpy
。
感谢hivemind的David找出了这一点!
张量创建操作:有什么区别?
让我们开始并找出这些差异都是关于什么的。
大写/小写:torch.Tensor()
与torch.tensor()
注意第一个选项torch.Tensor()
有一个大写的T
,而第二个选项torch.tensor()
有一个小写的t
。这个区别是怎么回事?
第一个选项带有大写的T
是torch.Tensor
类的构造函数,第二个选项是我们所说的_工厂函数_,它构建torch.Tensor
对象并返回给调用者。
你可以将torch.tensor()
函数视为一个工厂,它根据一些参数输入构建张量。工厂函数是一种创建对象的软件设计模式。如果你想了解更多,可以查看这里。
好的,这就是大写T
和小写t
之间的区别,但在这两种方式中,哪一种更好?答案是使用任何一个都可以。然而,工厂函数torch.tensor()
有更好的文档和更多的配置选项,所以它目前是胜出的选择。
默认dtype
与推断的dtype
好吧,在我们从使用列表中删除torch.Tensor()
构造函数之前,让我们回顾一下我们在打印的张量输出中观察到的区别。
区别在于每个张量的dtype
。让我们看看:
> print(o1.dtype)
torch.float32> print(o2.dtype)
torch.int32> print(o3.dtype)
torch.int32> print(o4.dtype)
torch.int32
这里的区别在于,torch.Tensor()
构造函数在构建张量时使用默认的dtype
。我们可以使用torch.get_default_dtype()
方法验证默认的dtype
:
> torch.get_default_dtype()
torch.float32
通过代码验证,我们可以这样做:
> o1.dtype == torch.get_default_dtype()
True
其他调用根据传入的数据选择dtype
。这被称为类型推断。dtype
是根据传入的数据推断的。请注意,也可以通过将dtype
作为参数指定,为这些调用显式设置dtype
:
> torch.tensor(data, dtype=torch.float32)
> torch.as_tensor(data, dtype=torch.float32)
使用torch.Tensor()
,我们无法向构造函数传递dtype
。这是torch.Tensor()
构造函数缺乏配置选项的一个例子。这是选择torch.tensor()
工厂函数来创建张量的另一个原因。
让我们看看这些替代创建方法之间的最后一个隐藏区别。
为了性能共享内存:复制与共享
第三个区别隐藏在幕后。为了揭示这个区别,我们需要在用ndarray
创建我们的张量后,改变原始输入数据在numpy.ndarray
中。
让我们这样做,看看我们得到什么:
> print('old:', data)
old: [1 2 3]> data[0] = 0> print('new:', data)
new: [0 2 3]> print(o1)
tensor([1., 2., 3.])> print(o2)
tensor([1, 2, 3], dtype=torch.int32)> print(o3)
tensor([0, 2, 3], dtype=torch.int32)> print(o4)
tensor([0, 2, 3], dtype=torch.int32)
注意,最初我们有data[0]=1
,还要注意我们只改变了原始numpy.ndarray
中的数据。注意我们没有明确地对我们的张量(o1
,o2
,o3
,o4
)进行任何更改。
然而,在设置data[0]=0
之后,我们可以看到我们的一些张量发生了变化。前两个o1
和o2
仍然在索引0
处有原始值1
,而后两个o3
和o4
在索引0
处有新值0
。
这是因为torch.Tensor()
和torch.tensor()
在输入数据时_复制_它们,而torch.as_tensor()
和torch.from_numpy()
在内存中与原始输入对象_共享_它们的输入数据。
共享数据 | 复制数据 |
---|---|
torch.as_tensor() | torch.tensor() |
torch.from_numpy() | torch.Tensor() |
这种共享只是意味着内存中的实际数据存在于一个地方。因此,对底层数据发生的任何更改都将反映在两个对象中,即torch.Tensor
和numpy.ndarray
。
共享数据比复制数据更有效,使用的内存更少,因为数据不会写入内存中的两个位置。
如果我们有一个torch.Tensor
,我们想将其转换为numpy.ndarray
,我们可以这样做:
> print(o3.numpy())
[0 2 3]> print(o4.numpy())
[0 2 3]
这给出了:
> print(type(o3.numpy()))
<class 'numpy.ndarray'>> print(type(o4.numpy()))
<class 'numpy.ndarray'>
这确立了torch.as_tensor()
和torch.from_numpy()
都与它们的输入数据共享内存。然而,我们应该使用哪一个,它们之间有什么区别?
torch.from_numpy()
函数只接受numpy.ndarray
,而torch.as_tensor()
函数接受各种数组式对象,包括其他PyTorch张量。因此,torch.as_tensor()
是在内存共享游戏中的胜出选择。
那为什么要这么多种函数呢?
在PyTorch中创建张量的最佳选项
鉴于所有这些细节,这两个是最佳选项:
-
torch.tensor()
-
torch.as_tensor()
torch.tensor()
调用是主要的选择,而torch.as_tensor()
应该在调整我们的代码以提高性能时使用。
关于内存共享(在可能的地方工作)的一些注意事项:
- 由于
numpy.ndarray
对象分配在CPU上,当使用GPU时,as_tensor()
函数必须将数据从CPU复制到GPU。 -
as_tensor()
的内存共享不适用于内置的Python数据结构,如列表。 -
as_tensor()
调用需要开发人员了解共享功能。这是必要的,这样我们就不会在不知不觉中对底层数据进行了不想要的更改,而没有意识到更改会影响到多个对象。 - 如果
numpy.ndarray
对象和张量对象之间有很多来回操作,as_tensor()
的性能提升将更大。然而,如果只是一个单一的加载操作,从性能角度来看不应该有太大影响。
总结
此时,我们应该对PyTorch的tensor
创建选项有了更好的理解。我们学习了工厂函数,并且看到了内存_共享与复制_如何影响性能和程序行为。下次见!
相关文章:

为深度学习创建PyTorch张量 - 最佳选项
为深度学习创建PyTorch张量 - 最佳选项 正如我们所看到的,PyTorch张量是torch.Tensor PyTorch类的实例。张量的抽象概念与PyTorch张量之间的区别在于,PyTorch张量为我们提供了一个可以在代码中操作的具体实现。 在上一篇文章中,我们看到了…...

详解数据增强中的平移shft操作
Shift 平移是指在数据增强(data augmentation)过程中,通过对输入图像或目标进行位置偏移(平移),让目标在图像中呈现出不同的位置。Shift 平移的目的是增加训练数据的多样性,从而提高模型对目标在…...

CCLINKIE转ModbusTCP网关,助机器人“掀起”工业智能的“惊涛骇浪”
以下是一个稳联技术CCLINKIE转ModbusTCP网关(WL-CCL-MTCP)连接三菱PLC与机器人的配置案例:设备与软件准备设备:稳联技术WL-CCL-MTCP网关、三菱FX5UPLC、支持ModbusTCP协议的机器人、网线等。 稳联技术ModbusTCP转CCLINKIE网关&…...
类型安全与代码复用的C# 泛型
一、引言:泛型 ——C# 编程的神奇钥匙 在 C# 编程的广袤天地里,泛型宛如一把神奇钥匙,能够开启高效、灵活且安全的代码之门🚪。 想象一下,你是一位经验丰富的建筑师,要建造各种各样的房子🏠。…...

卷积神经05-GAN对抗神经网络
卷积神经05-GAN对抗神经网络 使用Python3.9CUDA11.8Pytorch实现一个CNN优化版的对抗神经网络 简单的GAN图片生成 CNN优化后的图片生成 优化模型代码对比 0-核心逻辑脉络 1)Anacanda使用CUDAPytorch2)使用本地MNIST进行手写图片训练3)…...

vscode使用Marscode编程助手
下载 vscode 在插件里下载Marscode编程助手 插件完成 在这里点击安装,点击后这里出现AI编程插件。...

网络分析仪测试S参数
S参数的测试 一:S参数的定义 S参数(Scattering Parameters,散射参数)是一个表征器件在射频信号激励下的电气行为的工具,它以输入信号、输出信号为元素的矩阵来表现DUT的“传输”和“散射”效应,输入、输出…...
docker mysql5.7如何设置不区分大小写
环境 docker部署,镜像是5.7,操作系统是centos 操作方式 mysql 配置文件是放在 /etc/mysql/mysql.conf.d/mysqld.cnf, vim /etc/mysql/mysql.conf.d/mysqld.cnf lower_case_table_names1 重启mysql容器 验证 SHOW VARIABLES LIKE low…...

【1】Word:邀请函
目录 题目 文字解析 流程 题目 文字解析 考生文件夹☞Word.docx☞一定要用ms打开,wps打开作答无效☞作答完毕,F12或者手动另存为(考生文件夹:路径文件名) 注意:一定要检查,很有可能你前面步…...
【gin】中间件使用之jwt身份认证和Cors跨域,go案例
Gin-3 中间件编程及 JWT 身份认证 1. Gin 中间件概述 中间件是处理 HTTP 请求的函数,可以在请求到达路由处理函数之前或之后对请求进行处理。 在 Gin 框架中,中间件常用于处理日志记录、身份验证、权限控制等功能。 router : gin.Default() router.Us…...
【JAVA实战】@FeignClient注解类通用请求封装
背景 最近在编写多个系统数据集成过程中,经常会使用到FeignClient注解标记一个类,类里面编写很多请求方法,如果第三方系统有非常多的URL请求,每个方法对应一个URL请求,那么这个类就会非常的庞大,是否有一种…...

[c语言日寄]精英怪:三子棋(tic-tac-toe)3命慢通[附免费源码]
哈喽盆友们,今天带来《c语言》游戏中[三子棋boss]速通教程!我们的目标是一边编写博文,一边快速用c语言实现三子棋游戏。准备好瓜子,我们计时开始! 前期规划 在速通中,我们必须要有清晰的前期规划…...
GORM(Go语言数据交互库)
GORM(Go ORM,即对象关系映射)是Go语言中非常流行且功能强大的数据库交互库。它简化了与关系型数据库的交互过程,提供了丰富的API来处理各种数据库操作。下面将详细介绍GORM的功能、使用方法和一些高级特性。 1. 安装 首先&#…...
Redis主从同步是怎么实现的?
Redis主从同步是怎么实现的? 主从节点建立连接后,从节点会进行判断: 1.如果这是从节点之前没有同步过数据 属于初次复制,会进行全量重同步,那么从节点会向主节点发送PSYNC?-1 命令,请求主节点进行全量重…...

Flutter中Get.snackbar避免重复显示的实现
在pubspec.yaml中引入依赖框架。 #GetX依赖注解get: ^4.6.5创建一个SnackBarManager管理类去管理每个提示框。 import package:get/get.dart; import package:flutter/material.dart;class SnackBarManager {factory SnackBarManager() > instance;static final SnackBarMa…...

[Qt]常用控件介绍-多元素控件-QListWidget、QTableWidget、QQTreeWidget
目录 1.多元素控件介绍 2.ListWidget控件 属性 核心方法 核心信号 细节 Demo:编辑日程 3.TableWidget控件 核心方法 QTableWidgetItem核心信号 QTableWidgetItem核心方法 细节 Demo:编辑学生信息 4.TreeWidget控件 核心方法 核心信号…...

深入Android架构(从线程到AIDL)_32 JNI架构原理_Java与C的对接05
1、EIT造形观点 基于熟悉的EIT造形,很容易理解重要的架构设计决策议题。 前言 2、混合式EIT造形 一般EIT造形是同语言的。也就是<E>、 <I>和<T>都使用同一种语言撰写的,例如上述的Java、 C/C等。于此,将介绍一个EIT造…...
【gRPC】clientPool 客户端连接池简单实现与go案例
什么是 gRPC 客户端连接池? 在 gRPC 中,创建和维护一个到服务器的连接是非常消耗资源的(比如 TCP 连接建立和 TLS 握手)。 而在高并发场景下,如果每次请求都创建新的连接,不仅会导致性能下降,还…...

Android 15应用适配指南:所有应用的行为变更
Android系统版本适配,一直是影响App上架Google Play非常重要的因素。 当前Google Play政策规定 新应用和应用更新 必须以 Android 14(API 级别 34)为目标平台,才能提交到Google Play。现有应用 必须以 Android 13(AP…...

24-25-1-单片机开卷部分习题和评分标准
依据相关规定试卷必须按评分标准进行批改。 给分一定是宽松的,能给分一定给,如有疑问也可以向学院教务办申请查卷。 一部分学生期末成绩由于紧张或其他原因导致分数过低,也是非常非常遗憾的。 个人也是非常抱歉的。 开卷考试 简答题 第一…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...