详解PyTorch Tensor 数据类型——张量

news2024/11/25 9:48:41

目录

张量

张量的结构

张量的创建

张量的操作

数学运算

逻辑运算

形状操作

索引和切片

张量的维度变换

常见的数据类型存储

附录PyTorch官方API中文文档


张量

在PyTorch中,张量(Tensor)是一种常见的数据类型,它是一个多维数组。与Python中的列表或NumPy中的数组不同,张量可以在GPU上运行,这使得它们在深度学习中非常有用。本文将介绍张量的结构和用法,以及如何在PyTorch中使用它们。

张量的结构

张量是由一个数据类型和一个形状(shape)来描述的。形状是一个元组,其中包含每个维度的大小。例如,一个形状为(2, 3, 4)的张量表示一个三维数组,其中第一维大小为2,第二维大小为3,第三维大小为4。下面是一个简单的例子,创建一个形状为(2, 3, 4)的张量:

import torch

# 创建一个形状为(2, 3, 4)的张量
x = torch.randn(2, 3, 4)
print(x)
print(x.shape)

上述代码输出如下:

 

上述代码中,torch.randn是一个创建随机张量的函数,它使用给定的形状创建了一个形状为(2, 3, 4)的随机张量。我们使用print(x)输出张量,使用print(x.shape)输出张量的形状。

除了形状之外,每个张量还有一个数据类型。PyTorch支持多种数据类型,包括浮点数、整数和布尔值。下面是一些常见的数据类型:

  • torch.float32torch.float:32位浮点数
  • torch.float64torch.double:64位浮点数
  • torch.int8:8位整数
  • torch.int16torch.short:16位整数
  • torch.int32torch.int:32位整数
  • torch.int64torch.long:64位整数
  • torch.bool:布尔值

张量的创建

张量的基本结构是一个多维数组,其中每个元素都具有相同的数据类型和形状。在PyTorch中,我们可以使用torch.tensor函数创建张量,并指定它的形状和数据类型。例如,我们可以使用以下代码创建一个形状为(3, 2)、数据类型为float32的张量:

import torch

# 创建一个形状为(3, 2)、数据类型为float32的张量
x = torch.tensor([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]], dtype=torch.float32)

print(x)

上述代码输出如下:

上述代码中,我们使用torch.tensor函数创建了一个形状为(3, 2)、数据类型为float32的张量x。其中,dtype参数用于指定张量的数据类型,可以是torch.float32torch.float64torch.int32torch.int64等。

除了torch.tensor函数之外,PyTorch还提供了许多其他的张量创建函数,如torch.zerostorch.onestorch.randn等。这些函数的使用方式与torch.tensor类似,可以在PyTorch的文档中找到详细说明。

张量的操作

 在PyTorch中,我们可以对张量进行各种操作,包括数学运算、逻辑运算和形状操作。下面是一些常见的张量操作。

数学运算

张量可以进行各种数学运算,如加法、减法、乘法、除法、指数运算等。例如,我们可以使用torch.add函数进行张量相加:

import torch

# 创建两个形状为(2, 3)的张量
x = torch.randn(2, 3)
y = torch.randn(2, 3)

# 张量相加
z = torch.add(x, y)
print(z)

上述代码中,我们创建了两个形状为(2, 3)的张量xy,然后使用torch.add函数将它们相加,得到了形状相同的张量z

除了torch.add函数之外,PyTorch还提供了许多其他的数学运算函数,如torch.subtorch.multorch.divtorch.exp等。这些函数的使用方式与torch.add类似,可以在PyTorch的文档中找到详细说明。

逻辑运算

张量还可以进行逻辑运算,如比较、逻辑与、逻辑或等。例如,我们可以使用torch.eq函数进行张量比较:

import torch

# 创建两个形状为(2, 3)的张量
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
y = torch.tensor([[4, 5, 6], [1, 2, 3]])

# 张量比较
z = torch.eq(x, y)
print(z)

 

上述代码中,我们创建了两个形状为(2, 3)的张量xy,然后使用torch.eq函数比较它们,得到了形状相同的布尔型张量z

除了torch.eq函数之外,PyTorch还提供了许多其他的逻辑运算函数,如torch.gttorch.lt、torch.getorch.letorch.ne等。这些函数的使用方式与torch.eq类似,可以在PyTorch的文档中找到详细说明。

形状操作

张量还可以进行形状操作,包括改变形状、拼接、切片等。例如,我们可以使用torch.reshape函数改变张量的形状:

import torch

# 创建一个形状为(2, 3)的张量
x = torch.randn(2, 3)

# 改变张量的形状
y = torch.reshape(x, (3, 2))
print(y)

上述代码中,我们创建了一个形状为(2, 3)的张量x,然后使用torch.reshape函数将它改变为形状为(3, 2)的张量y

除了torch.reshape函数之外,PyTorch还提供了许多其他的形状操作函数,如torch.cattorch.stacktorch.splittorch.chunk等。这些函数的使用方式与torch.reshape类似,可以在PyTorch的文档中找到详细说明。

索引和切片

在PyTorch中,我们可以使用索引和切片操作来访问张量中的元素。例如,我们可以使用索引操作访问张量中的单个元素:

import torch

# 创建一个形状为(2, 3)的张量
x = torch.tensor([[1, 2, 3], [4, 5, 6]])

# 使用索引操作访问张量中的单个元素
print(x[0, 1])

上述代码中,我们创建了一个形状为(2, 3)的张量x,然后使用索引操作访问了它的第一行第二列元素。

除了索引操作之外,PyTorch还支持各种切片操作,如使用冒号(:)来进行切片。例如,我们可以使用切片操作访问张量的一部分:

import torch

# 创建一个形状为(2, 3)的张量
x = torch.tensor([[1, 2, 3], [4, 5, 6]])

# 使用切片操作访问张量的一部分
print(x[:, 1:])

 

 上述代码中,我们创建了一个形状为(2, 3)的张量x,然后使用切片操作访问了它的所有行的第二列及以后的元素。

张量的维度变换

在PyTorch中,我们可以使用各种张量操作来改变张量的维度,以便适应不同的任务和模型。下面介绍几种常用的张量维度变换操作:

1. reshape:该操作可以改变张量的形状,但不改变张量中的元素个数。例如,可以将一个形状为(1, 3, 224, 224)的张量转换为形状为(3, 224, 224)的张量,代码如下:

import torch

x = torch.randn(1, 3, 224, 224)
y = x.reshape(3, 224, 224)
print(y.shape)  # 输出:torch.Size([3, 224, 224])

2. transpose:该操作可以交换张量的维度顺序,例如将一个形状为(1, 3, 224, 224)的张量转换为形状为(224, 224, 3)的张量,代码如下:

import torch

x = torch.randn(1, 3, 224, 224)
y = x.transpose(1, 3).transpose(1, 2)
print(y.shape)  # 输出:torch.Size([224, 224, 3])

3. unsqueeze/unsqueeze:该操作可以在指定的维度上添加一个新的维度,例如将一个形状为(3, 224, 224)的张量转换为形状为(1, 3, 224, 224)的张量,代码如下:

import torch

x = torch.randn(3, 224, 224)
y = x.unsqueeze(0)
print(y.shape)  # 输出:torch.Size([1, 3, 224, 224])

4. squeeze/unsqueeze:该操作可以在指定的维度上移除一个维度,例如将一个形状为(1, 3, 224, 224)的张量转换为形状为(3, 224, 224)的张量,代码如下:

import torch

x = torch.randn(1, 3, 224, 224)
y = x.squeeze(0)
print(y.shape)  # 输出:torch.Size([3, 224, 224])

总之,在PyTorch中,张量的维度变换操作可以帮助我们方便地进行数据处理和模型构建,提高代码的可读性和灵活性。需要根据具体的需求选择合适的操作,以达到最优的效果。

常见的数据类型存储

在计算机中,不同类型的数据都有自己特定的存储方式和编码方式。下面简单介绍一下常见数据类型在计算机中的存储方式和张量中的表示方式:

  1. 字符串文字:字符串文字在计算机中是由一系列字符组成的,每个字符占用一个字节或多个字节。在PyTorch中,字符串文字可以被表示为一个1维的张量,其中每个元素都代表一个字符的编码。

  2. 图片:图片在计算机中通常以像素矩阵的形式存储,每个像素的颜色值可以使用不同的编码方式进行表示,如RGB、灰度、CMYK等。在PyTorch中,图片可以被表示为一个4维的张量,其中第0维表示批次数,第1维表示通道数,第2维表示高度,第3维表示宽度。例如,一个形状为(1, 3, 224, 224)的张量可以表示一张RGB格式的224x224的图片。

  3. 视频:视频是由一系列帧组成的,每一帧都可以看作是一张图片。在计算机中,视频通常以帧序列的形式存储。在PyTorch中,视频可以被表示为一个5维的张量,其中第0维表示批次数,第1维表示帧数,第2维表示通道数,第3维表示高度,第4维表示宽度。例如,一个形状为(1, 16, 3, 224, 224)的张量可以表示一段16帧的RGB格式的224x224的视频。

  4. 声音:声音是一种连续的信号,可以使用不同的采样率和编码方式进行表示。在PyTorch中,声音可以被表示为一个1维的张量,其中每个元素都代表一个采样点的值。需要注意的是,声音信号的采样率和位深度决定了张量的大小和数据类型。

总之,不同类型的数据在计算机中都有自己的存储方式和编码方式,而在PyTorch中,这些数据都可以被表示为张量,并且可以方便地进行各种张量操作。在实际应用中,我们通常需要将不同类型的数据转换为张量,并将它们输入到神经网络中进行训练和预测。

附录PyTorch官方API中文文档

PyTorch官方API文档的中文版可以在以下网址查看:

https://pytorch.apachecn.org/docs/1.9/

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

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

相关文章

如何快速将多图片合并拼接成一张大图并保留原图质量 - 极速图片合成拼接器软件简介

在工作中我们有时需要把多张图片打印在一张纸上,那就必须手动排列和调整每张图片的大小,这可是一项费时费力的任务。 借助极速图片合成拼接器这款软件,终于可以快速自动解决这种任务啦! 它是一款可以自动一次性将多个图像文件合并…

Jenkins部署angular11自动打包

可能年纪大了,对于新东西的学习和接收有点慢,花了差不多一周的时间,终于把jenkins配置好了,可以自动打包,与手动打出来的一样,以后就解放双手了。#!/bin/bashnpm cache clean -fnpm -vnode -vnpm install n…

ubuntu 18.04.06LST安装R4.0+版本报错及解决过程

1. sudo apt-get update无法正常使用 错误:13 http://ppa.launchpad.net/webupd8team/sublime-text-3/ubuntu bionic Release 404 Not Found [IP: 2620:2d:4000:1::3e 80] 解决措施:删除 webupd8team/sublime-text-3这个ppa文件。 sudo add-apt-repository --…

MySQL调优 - SQL查询深度分页问题

一、问题引入 例如当前存在一张表test_user,然后往这个表里面插入3百万的数据: CREATE TABLE test_user (id int(11) NOT NULL AUTO_INCREMENT COMMENT 主键id,user_id varchar(36) NOT NULL COMMENT 用户id,user_name varchar(30) NOT NULL COMMENT 用…

嵌入式学习笔记——寄存器开发STM32 GPIO口

寄存器开发STM32GPIO口前言认识GPIOGPIO是什么GPIO有什么用GPIO怎么用STM32上GPIO的命名以及数量GPIO口的框图(重点)输入框图解析三种输入模式GPIO输入时内部器件及其作用1.保护二极管2.上下拉电阻(可配置)3.施密特触发器4.输入数…

什么是CatGPT-使用效果如何-

个人使用效果,评分优,足以满足教学和填表。程序媛借助CatGPT(ChatGPT更佳),基本上可以秒杀不用此类工具的程序猿(男)!!!问:为什么使用AIGC能大幅度…

79、ClimateNeRF: Physically-based Neural Rendering for Extreme Climate Synthesis

简介主页物理模拟可以很好地预测天气影响。神经辐射场产生SOTA场景模型。ClimateNeRF 允许我们渲染真实的天气效果,包括雾霾、雪和洪水 ,结果可以通过有物理意义的变量来控制,比如水位 ,这允许人们可视化气候变化的结果将对他们产…

2022年MathorCup数学建模B题无人仓的搬运机器人调度问题解题全过程文档加程序

2022年第十二届MathorCup高校数学建模 B题 无人仓的搬运机器人调度问题 原题再现 本题考虑在无人仓内的仓库管理问题之一,搬运机器人 AGV 的调度问题。更多的背景介绍请参看附件-背景介绍。对于无人仓来说,仓库的地图模型可以简化为图的数据结构。 仓库…

面试常问【进程间通信】最详细解说

文章目录 目录 文章目录 一、进程间有哪几种的通信方式 1.为什么需要进程间通信? 2.进程通信的几种方式 3.进程间通信的目的 二、管道 1.匿名管道 2.命名管道 3.管道总结 三、消息队列 四、共享内存 1.共享内存的原理 2.共享内存的接口 1.创建共享内存 2.将共享内存附加到进程…

HBase---Hbase安装(单机版)

Hbase安装单机版 文章目录Hbase安装单机版Master/Slave架构安装步骤配置Hbase1.上传压缩包解压更名修改hbase-env.sh修改hbase-site.xml配置HBase环境变量配置Zookeeper复制配置文件修改zoo.cfg配置文件修改myid配置Zookeeper环境变量刷信息配置文件启动hbase步骤hbase shellMa…

BS系统中的安全方案(SSO和Oauth2认证,数据加密)

摘要用户用浏览器打开网站,DNS会根据域名找到相应的服务器IP给到浏览器,仅接着用户的浏览器会与服务器建立连接,通过网路上的各个设备(交换机、路由器、基站、光纤等),将服务器上的数据发送到用户的电脑上,在浏览器里呈…

运输层概述及web请求

运输层 运输层概述 运输层向高层用户屏蔽了下面网络核心的细节(如网络拓扑、所采用的路由选择协议等)它使应用进程看见的就好像是在两个运输层实体之间有一条端到端的逻辑通信信道; 根据需求不同,运输层提供两种运输协议 面向连…

buffer它到底做了个啥,源码级分析linux内核的文件系统的缓冲区

最近一直在学习linux内核源码,总结一下 https://github.com/xiaozhang8tuo/linux-kernel-0.11 自己整理过的带注释的源码。 为什么要有buffer ​ 高速缓冲区是文件系统访问块设备中数据的必经要道(PS:如果所有程序结果都不落盘,只是int a, a直接在主存…

TryHackMe-Debug(ez php反序列化)

Debug Linux机器CTF!您将了解枚举,查找隐藏的密码文件以及如何利用php反序列化! 端口扫描 循例,nmap Web枚举 进到web是apache默认页面,直接开扫 由于题目告诉我们涉及php反序列化,那直接找php文件来看&…

Linux学习第十四节-shell脚本

1.Shell概述 Shell连接了用户和Linux内核,他可以解释用户输入的命令传输给内核,让用户可以更加方便的使用Linux系统; Shell本身并不是内核的一部分,他只是站在内核的基础上编写一个应用程序; Shell具备编程的能力&a…

C++回顾(八)—— 继承

8.1 继承的概念 继承是类与类之间的关系,是一个很简单很直观的概念,与现实世界中的继承类似,例如儿子继承父亲的财产。 继承(Inheritance)可以理解为一个类从另一个类获取成员变量和成员函数的过程。例如类 B 继承于类…

jconsole远程linux下的tomcat

修改Tomcat的配置 进去 Tomcat 安装目录下的 bin 目录,编辑 catalina.sh vi catalina.sh定位到 ----- Execute The Requested Command ----------------------------------------- vi 编辑模式下,点击 Esc,输入 / ,然后粘贴 -…

什么是Netty

一.Netty介绍 1.什么是netty Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序,是目前最流行的 NIO 框架,Netty 在互联网领域、大数据分布式计算…

自动驾驶介绍系列 ———— 看门狗

文章目录硬件看门狗软件看门狗差异分析延申窗口看门狗硬件看门狗 硬件看门狗的本质上是一个定时器电路。通常存在一个输入,输入到MCU的RST端。在正常工作状态下,MCU每隔固定时间间隔会输出一个信号给RST端,实现对看门狗端清零。如果在指定的时…

RK3568驱动OV13850摄像头模组调试过程

摄像头介绍品牌:Omnivision型号:CMK-OV13850接口:MIPI像素:1320WOV13850彩色图像传感器是一款低电压、高性能1/3.06英寸1320万像素CMOS图像传感器,使用OmniBSI?技术提供了单-1320万像素(42243136)摄像头的…