为深度学习创建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()​应该在调整我们的代码以提高性能时使用。

在这里插入图片描述

关于内存共享(在可能的地方工作)的一些注意事项:

  1. 由于numpy.ndarray​对象分配在CPU上,当使用GPU时,as_tensor()​函数必须将数据从CPU复制到GPU。
  2. as_tensor()​的内存共享不适用于内置的Python数据结构,如列表。
  3. as_tensor()​调用需要开发人员了解共享功能。这是必要的,这样我们就不会在不知不觉中对底层数据进行了不想要的更改,而没有意识到更改会影响到多个对象。
  4. 如果numpy.ndarray​对象和张量对象之间有很多来回操作,as_tensor()​的性能提升将更大。然而,如果只是一个单一的加载操作,从性能角度来看不应该有太大影响。
总结

此时,我们应该对PyTorch的tensor​创建选项有了更好的理解。我们学习了工厂函数,并且看到了内存_共享与复制_如何影响性能和程序行为。下次见!

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

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

相关文章

RabbitMQ(四)

SpringBoot整合RabbitMQ SpringBoot整合1、生产者工程①创建module②配置POM③YAML④主启动类⑤测试程序 2、消费者工程①创建module②配置POM③YAML文件内配置&#xff1a; ④主启动类⑤监听器 3、RabbitListener注解属性对比①bindings属性②queues属性 SpringBoot整合 1、生…

项目练习:若依管理系统字典功能-Vue前端部分

文章目录 一、情景说明二、若依Vue相关代码及配置1、utils代码2、components组件3、api接口代码4、Vuex配置5、main.js配置 三、使用方法1、html部分2、js部分 一、情景说明 我们在做web系统的时候&#xff0c;肯定会遇到一些常量选择场景。 比如&#xff0c;性别&#xff1a;…

【 PID 算法 】PID 算法基础

一、简介 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&#xff09;、Differential&#xff08;微分&#xff09;的缩写。也就是说&#xff0c;PID算法是结合这三种环节在一起的。粘一下百度百科中的东西吧。 顾名思义&#xff0c;…

微信小程序原生与 H5 交互方式

在微信小程序中&#xff0c;原生与 H5 页面&#xff08;即 WebView 页面&#xff09;之间的交互通常有以下几种方式&#xff1a; 1. 使用 postMessage 进行通信 微信小程序的 WebView 页面和原生小程序页面可以通过 postMessage 来进行数据传递。 WebView 页面向原生小程序发…

c++领域展开第十二幕——类和对象(STL简介——简单了解STL)超详细!!!!

文章目录 前言STL简介什么是STLSTL的版本STL的六大组件STL的重要性如何学习STL 总结 前言 上篇博客我们了解了初阶的模版函数&#xff0c;以及有关的一些使用方法。 今天我们来了解了解STL库的有关知识 跟我一起上车吧 STL简介 什么是STL STL&#xff1a;是C标准库的重要组成…

音频语言模型与多模态体系结构

音频语言模型与多模态体系结构 多模态模型正在创造语言、视觉和语音等以前独立的研究领域的协同效应。这些模型使用通用架构,将每种模式视为不同的“token”,使它们能够以一种与人类认知非常相似的方式联合建模和理解世界。 ​ ​可以将多模态分为两个主要领域:输入空间(…

HTML中最基本的东西

本文内容的标签&#xff0c;将是看懂HTML的最基本之基本 &#xff0c;是跟您在写文章时候一样内容。一般想掌握极其容易&#xff0c;但是也要懂得如何使用&#xff0c;过目不忘&#xff0c;为手熟尔。才是我们学习的最终目的。其实边看边敲都行&#xff0c;或者是边看边复制粘贴…

LVGL移植高通点阵字库GT30L24A3W

字库芯片: GT30L24A3W MCU:STM32F429 LVGL版本:V8.4 一、实现gt_read_data() 和 r_dat_bat() 请参考下面视频 如何在32位MCU上使用高通点阵字库_哔哩哔哩_bilibili 高通字库使用教程(1)硬件链接与注意事项部分_哔哩哔哩_bilibili 高通字库使用教程(2)SPI底层函数使用_哔哩…

计算机的错误计算(二百一十二)

摘要 利用两个大模型计算 实验表明&#xff0c;两个大模型均进行了中肯的分析。另外&#xff0c;其中一个大模型给出了 Python代码&#xff0c;运行后&#xff0c;结果中有7位错误数字&#xff1b;而一个大模型进行加减运算时出错。 例1. 计算 下面是与一个大模型的对话…

蓝桥与力扣刷题(709 转换成小写字母)

题目&#xff1a;给你一个字符串 s &#xff0c;将该字符串中的大写字母转换成相同的小写字母&#xff0c;返回新的字符串。 示例 1&#xff1a; 输入&#xff1a;s "Hello" 输出&#xff1a;"hello"示例 2&#xff1a; 输入&#xff1a;s "here…

9.7 visual studio 搭建yolov10的onnx的预测(c++)

1.环境配置 在进行onnx预测前&#xff0c;需要搭建的环境如下: 1.opencv环境的配置&#xff0c;可参考博客:9.2 c搭建opencv环境-CSDN博客 2.libtorch环境的配置&#xff0c;可参考博客&#xff1a;9.4 visualStudio 2022 配置 cuda 和 torch (c)-CSDN博客 3.cuda环境的配置…

自建RustDesk服务器

RustDesk服务端 下面的截图是我本地的一个服务器做为演示用&#xff0c;你自行的搭建服务需要该服务器有固定的ip地址 1、通过宝塔面板快速安装 2、点击【安装】后会有一个配置信息&#xff0c;默认即可 3、点击【确认】后会自动安装等待安装完成 4、安装完成后点击【打开…

浅谈云计算15 | 存储可靠性技术(RAID)

存储可靠性技术 一、存储可靠性需求1.1 数据完整性1.2 数据可用性1.3 故障容错性 二、传统RAID技术剖析2.1 RAID 02.2 RAID 12.3 RAID 52.4 RAID 62.5 RAID 10 三、RAID 2.0技术3.1 RAID 2.0技术原理3.1.1 两层虚拟化管理模式3.1.2 数据分布与重构 3.2 RAID 2.0技术优势3.2.1 自…

Android JecPack组件之LifeCycles 使用详解

一、背景 LifeCycle 是一个可以感知宿主生命周期变化的组件。常见的宿主包括 Activity/Fragment、Service 和 Application。LifeCycle 会持有宿主的生命周期状态的信息&#xff0c;当宿主生命周期发生变化时&#xff0c;会通知监听宿主的观察者。 LifeCycle 的出现主要是为了…

Facebook 隐私风波:互联网时代数据安全警钟

在社交媒体飞速发展的今天&#xff0c;个人数据的隐私保护已成为全球关注的焦点。作为全球最大的社交平台之一&#xff0c;Facebook面临的隐私问题&#xff0c;尤其是数据泄露事件&#xff0c;频繁引发公众的广泛讨论。从用户信息被滥用到数据泄漏&#xff0c;Facebook的隐私挑…

candb++ windows11运行报错,找不到mfc140.dll

解决问题记录 mfc140.dll下载 注意&#xff1a;放置位置别搞错了

蓝桥杯备赛:顺序表和单链表相关算法题详解(上)

目录 一.询问学号&#xff08;顺序表&#xff09; 1.题目来源&#xff1a; 2.解析与代码实现&#xff1a; &#xff08;1&#xff09;解析&#xff1a; &#xff08;2&#xff09;代码实现&#xff1a; 二.寄包柜&#xff08;顺序表&#xff09; 1.题目来源&#xff1a; …

uni-app的学习

uni-app 有着跨平台支持、丰富的插件和生态系统、高性能、集成开发工具HBuilderX的配合使用。允许使用者仅通过一套代码发布到多平台使用。 uni-app官网 uni-app 是一个适合开发跨平台移动应用和小程序的框架&#xff0c;能够大幅提高开发效率。 一、了解 1.1 工具准备 从Git…

基于光偏振与光学调制实现白光干涉相移

基于光的偏振特性和一些光学元件对光的调制作用&#xff0c;实现白光干涉中的光学相移原理是一个复杂而精细的过程。以下是对这一原理的详细解释&#xff1a; 一、光的偏振特性 光的偏振是指光波在传播过程中&#xff0c;光矢量的方向和大小有规则变化的现象。圆偏振光的电场…

Flutter:封装ActionSheet 操作菜单

演示效果图 action_sheet_util.dart import package:ducafe_ui_core/ducafe_ui_core.dart; import package:flutter/material.dart; import package:demo/common/index.dart;class ActionSheetUtil {/// 底部操作表/// [context] 上下文/// [title] 标题/// [items] 选项列表 …