【PyTorch】Tensor(张量)介绍

news2024/9/21 18:15:00

Tensor 的概念

Tensor 中文为张量。张量的意思是一个多维数组,它是标量、向量、矩阵的高维扩展。
标量可以称为 0 维张量,向量可以称为 1 维张量,矩阵可以称为 2 维张量,RGB 图像可以表示 3 维张量。你可以把张量看作多维数组。
在这里插入图片描述

Tensor 与 Variable

在 PyTorch 0.4.0 之前,torch.autograd 包中存在 Variable 这种数据类型,主要是用于封装 Tensor,进行自动求导。Variable 主要包含下面几种属性。

  • data: 被包装的 Tensor。
  • grad: data 的梯度。
  • grad_fn: 创建 Tensor 所使用的 Function,是自动求导的关键,因为根据所记录的函数才能计算出导数。
  • requires_grad: 指示是否需要梯度,并不是所有的张量都需要计算梯度。
  • is_leaf: 指示是否叶子节点(张量),叶子节点的概念在计算图中会用到,后面详细介绍。
    在这里插入图片描述

在 PyTorch 0.4.0 之后,Variable 并入了 Tensor。在之后版本的 Tensor 中,除了具有上面 Variable 的 5 个属性,还有另外 3 个属性。

  • dtype: 张量的数据类型,如 torch.FloatTensor,torch.cuda.FloatTensor。
  • shape: 张量的形状。如 (64, 3, 224, 224)。
  • device: 张量所在设备 (CPU/GPU),GPU 是加速计算的关键。

在这里插入图片描述
关于 dtype,PyTorch 提供了 9 种数据类型,共分为 3 大类:float (16-bit, 32-bit, 64-bit)、integer (unsigned-8-bit ,8-bit, 16-bit, 32-bit, 64-bit)、Boolean。模型参数和数据用的最多的类型是 float-32-bit。label 常用的类型是 integer-64-bit。
在这里插入图片描述

Tensor 创建的方法

直接创建 Tensor

torch.tensor()

功能:从data创建tensor

torch.tensor(data, dtype=None, device=None, requires_grad=False, pin_memory=False)
  • data: 数据,可以是 list,numpy
  • dtype: 数据类型,默认与 data 的一致
  • device: 所在设备,cuda/cpu
  • requires_grad: 是否需要梯度
  • pin_memory: 是否存于锁页内存

代码示例:

arr = np.ones((3, 3))
print("ndarray的数据类型:", arr.dtype)
# 创建存放在 GPU 的数据
# t = torch.tensor(arr, device='cuda')
t= torch.tensor(arr)
print(t)

输出为:

ndarray的数据类型: float64
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]], dtype=torch.float64)

torch.from_numpy(ndarray)

功能:从numpy创建tensor

注意事项:从 numpy 创建 tensor。利用这个方法创建的 tensor 和原来的 ndarray 共享内存,当修改其中一个数据,另外一个也会被改动。
在这里插入图片描述

代码示例:

arr = np.array([[1, 2, 3], [4, 5, 6]])
t = torch.from_numpy(arr)

# 修改 array,tensor 也会被修改
# print("\n修改arr")
# arr[0, 0] = 0
# print("numpy array: ", arr)
# print("tensor : ", t)

# 修改 tensor,array 也会被修改
print("\n修改tensor")
t[0, 0] = -1
print("numpy array: ", arr)
print("tensor : ", t)

输出为:

修改tensor
numpy array:  [[-1  2  3]
 [ 4  5  6]]
tensor :  tensor([[-1,  2,  3],
        [ 4,  5,  6]], dtype=torch.int32)

根据数值创建 Tensor

torch.zeros()

功能:根据 size 创建全 0 张量

torch.zeros(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
  • size: 张量的形状
  • out: 输出的张量,如果指定了 out,那么torch.zeros()返回的张量和 out 指向的是同一个地址
  • layout: 内存中布局形式,有 strided,sparse_coo 等。当是稀疏矩阵时,设置为 sparse_coo 可以减少内存占用。
  • device: 所在设备,cuda/cpu
  • requires_grad: 是否需要梯度

代码示例:

out_t = torch.tensor([1])
# 这里制定了 out
t = torch.zeros((3, 3), out=out_t)
print(t, '\n', out_t)
# id 是取内存地址。最终 t 和 out_t 是同一个内存地址
print(id(t), id(out_t), id(t) == id(out_t))

输出是:

tensor([[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]]) 
 tensor([[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]])
2984903203072 2984903203072 True

torch.zeros_like()

功能:根据 input 形状创建全 0 张量

torch.zeros_like(input, dtype=None, layout=None, device=None, requires_grad=False, memory_format=torch.preserve_format)
  • input: 创建与 input 同形状的全 0 张量
  • dtype: 数据类型
  • layout: 内存中布局形式,有 strided,sparse_coo 等。当是稀疏矩阵时,设置为 sparse_coo 可以减少内存占用。

同理还有全 1 张量的创建方法:torch.ones(),torch.ones_like()

torch.full(),torch.full_like()

功能:创建自定义数值的张量

torch.full(size, fill_value, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
  • size: 张量的形状,如 (3,3)
  • fill_value: 张量中每一个元素的值

代码示例:

t = torch.full((3, 3), 1)
print(t)

输出为:

tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]])

torch.arange()

功能:创建等差的 1 维张量。注意区间为[start, end)。

torch.arange(start=0, end, step=1, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
  • start: 数列起始值
  • end: 数列结束值,开区间,取不到结束值
  • step: 数列公差,默认为 1

代码示例:

t = torch.arange(2, 10, 2)
print(t)

输出为:

tensor([2, 4, 6, 8])

torch.linspace()

torch.linspace(start, end, steps=100, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

功能:创建均分的 1 维张量。数值区间为 [start, end]

  • start: 数列起始值
  • end: 数列结束值
  • steps: 数列长度 (元素个数)

代码示例:

# t = torch.linspace(2, 10, 5)
t = torch.linspace(2, 10, 6)
print(t)

输出为:

tensor([ 2.0000,  3.6000,  5.2000,  6.8000,  8.4000, 10.0000])

torch.logspace()

功能:创建对数均分的 1 维张量。数值区间为 [start, end],底为 base。

torch.logspace(start, end, steps=100, base=10.0, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
  • start: 数列起始值
  • end: 数列结束值
  • steps: 数列长度 (元素个数)
  • base: 对数函数的底,默认为 10

代码示例:

# t = torch.logspace(2, 10, 5)
t = torch.logspace(2, 10, 6)
print(t)

输出为:

tensor([1.0000e+02, 3.9811e+03, 1.5849e+05, 6.3096e+06, 2.5119e+08, 1.0000e+10])

torch.eye()

功能:创建单位对角矩阵( 2 维张量),默认为方阵

torch.eye(n, m=None, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
  • n: 矩阵行数。通常只设置 n,为方阵。
  • m: 矩阵列数

根据概率创建 Tensor

torch.normal()

功能:生成正态分布 (高斯分布)

torch.normal(mean, std, *, generator=None, out=None)
  • mean: 均值
  • std: 标准差

有 4 种模式:

  1. mean 为标量,std 为标量。这时需要设置 size。

    代码示例:

    # mean:标量 std: 标量
    # 这里需要设置 size
    t_normal = torch.normal(0., 1., size=(4,))
    print(t_normal)
    

    输出为:

    tensor([0.6614, 0.2669, 0.0617, 0.6213])
    
  2. mean 为标量,std 为张量

  3. mean 为张量,std 为标量

    代码示例:

    # mean:张量 std: 标量
    mean = torch.arange(1, 5, dtype=torch.float)
    std = 1
    t_normal = torch.normal(mean, std)
    print("mean:{}\nstd:{}".format(mean, std))
    print(t_normal)
    

    输出为:

    mean:tensor([1., 2., 3., 4.])
    std:1
    tensor([1.6614, 2.2669, 3.0617, 4.6213])
    

    这 4 个数采样分布的均值不同,但是方差都是 1。

  4. mean 为张量,std 为张量

    代码示例:

    # mean:张量 std: 张量
    mean = torch.arange(1, 5, dtype=torch.float)
    std = torch.arange(1, 5, dtype=torch.float)
    t_normal = torch.normal(mean, std)
    print("mean:{}\nstd:{}".format(mean, std))
    print(t_normal)
    

    输出为:

    mean:tensor([1., 2., 3., 4.])
    std:tensor([1., 2., 3., 4.])
    tensor([1.6614, 2.5338, 3.1850, 6.4853])
    

    其中 1.6614 是从正态分布 N ( 1 , 1 ) N(1,1) N(1,1) 中采样得到的,其他数字以此类推。

torch.randn() 和 torch.randn_like()

功能:生成标准正态分布。

torch.randn(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
  • size: 张量的形状

torch.rand() 和 torch.rand_like()

功能:在区间 [0, 1) 上生成均匀分布

torch.rand(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

torch.randint() 和 torch.randint_like()

功能:在区间 [low, high) 上生成整数均匀分布

randint(low=0, high, size, *, generator=None, out=None,
dtype=None, layout=torch.strided, device=None, requires_grad=False)
  • size: 张量的形状

torch.randperm()

功能:生成从 0 到 n-1 的随机排列。常用于生成索引。

torch.randperm(n, out=None, dtype=torch.int64, layout=torch.strided, device=None, requires_grad=False)
  • n: 张量的长度

torch.bernoulli()

功能:以 input 为概率,生成伯努利分布 (0-1 分布,两点分布)

torch.bernoulli(input, *, generator=None, out=None)
  • input: 概率值

参考链接

PyTorch 学习笔记

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

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

相关文章

Redis作为单线程模型,为什么效率高、速度快呢?

前言: 效率高、速度快是相较于数据库来说的(MySQL、Orcale、SQL server) 文章目录 一、单线程模式的工作流程二、为什么快? 一、单线程模式的工作流程 这里我们所说的单线程是指:Redis只使用一个线程,来处…

PPP的配置

概述:PPP模式,即公私合作模式(Public-Private Partnership),是一种公共部门与私营部门合作的模式。 一、实验拓扑 实验一:PPP基本功能 实验步骤: (1)配置AR1的接口IP地…

xilinx hbm ip运用

AXI-HBM是一个集成的IP核,该核提供高达16个AXI3从PORT的HBM接口,每个使用他自己的独立的时钟。HBM2 GEN存储器也支持,HBM相对传统DDR的方案,带宽得到极大的提高 特征 AXI3从端口存储器接口 -16个独立的256bit存储器接口 -可选的…

国标视频流媒体服务GB28181和Ehome等多协议接入的Liveweb方案详解

Liveweb视频融合/汇聚云平台基于“云-边-端”一体化架构,部署轻量简单、功能灵活多样,平台可支持多协议(GB28181/RTSP/Onvif/海康SDK/Ehome/大华SDK/RTMP推流等)、多类型设备接入(IPC/NVR/监控平台),在视频能力上&…

企业文档管理系统哪个好?2024年热门的10款文档管理系统软件推荐

在信息化时代,企业每天都会生成海量的文档、数据和资料。 如何有效管理这些文档,确保信息安全、版本控制和协同办公顺畅,是每个企业都必须面对的挑战。 2024年,随着技术的不断进步,市场上涌现出了众多优秀的文档管理…

STM32如何修改外部晶振频率和主频

对于STM32F10x系列的单片机,除了STM32F10x_CL单片机,其它的单片机一般外部晶振HSE的时钟频率都默认是8MHz。如果我们使用的外部晶振为12Mhz,那么可以把上图绿色标记改为:12000000 72MHz的主频8MHz的外部晶振HSE*倍频系数9。当然如果像上面把外…

ChatGPT 在国内使用的方法

AI如今很强大,聊聊天、写论文、搞翻译、写代码、写文案、审合同等等,ChatGPT 真是无所不能~ 作为一款出色的大语言模型,ChatGPT 实现了人类般的对话交流,最主要是能根据上下文进行互动。 接下来,我将介绍 ChatGPT 在国…

Android-UI设计

控件 控件是用户与应用交互的元素。常见的控件包括: 按钮 (Button):用于执行动作。文本框 (EditText):让用户输入文本。复选框 (CheckBox):允许用户选择或取消选择某个选项。单选按钮 (RadioButton):用于在多个选项中…

『功能项目』QFrameWorkBug关联Slot(插槽)【67】

我们打开上一篇66QFrameWorkBug拖拽功能的项目, 本章要做的事情是关联插槽Slot 修改脚本:UISlot.cs 修改脚本:UGUICanvas.cs 此时关联Slot已经完成 接下来的文章内容: 1.QFrameWork扔到地上UGUI 2.位置存储功能 3.点击名称寻…

IBM Spectrum LSF 用户基础

获取 IBM Spectrum LSF 工作负载管理概念和操作的概述。 1、IBM Spectrum LSF 概述 LSF 如何满足您的作业需求并找到运行该作业的最佳资源。 - IBM Spectrum LSF IBM Spectrum LSF (“LSF” ,简称为负载共享设施) 软件是业界领先的企业级软件。 LSF 在现有异构 I…

【C++】内联函数(inline function)详解

🦄个人主页:小米里的大麦-CSDN博客 🎏所属专栏:C_小米里的大麦的博客-CSDN博客 🎁代码托管:C: 探索C编程精髓,打造高效代码仓库 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、前言 语法: 在函数定义前加上关键字 inli…

2024华为杯研赛数学建模E题分析

2024华为杯数学建模E题分析如下,完整版本可查看最下方名片

基于SSM+Vue+MySQL的家教服务管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着现代社会对教育质量要求的不断提升,家教行业迎来了前所未有的发展机遇。然而,家教市场也面临着信息不对称、管理不规范、匹配效率低等挑战。为了解决这些问题,提高家教服务的质量和效率&a…

【Python】Anaconda插件:Sublime Text中的Python开发利器

上班的时候没人问我苦不苦,下班的时候总有人问为什么走这么早。 Anaconda 是一个专为Sublime Text打造的开源Python开发插件,旨在为开发者提供类似于IDE的丰富功能,提升Python编码效率。该插件提供了代码补全、语法检查、代码片段提示等多项…

U9多组织单据关连生单时的错误提示

开立采购退货单时,有以下的错误提示。从这段文字来看。生成【采购退货单】同时生成关联公司的【退回处理单】,检查退回处理单的单据类型是正常的。不明所以。系统商出来的错误提示一般是用来迷惑人的,不可尽信。 【未找到满足条件【上游推式…

工程师 - Windows下使用WSL本地安装Linux

Setting Up to Use Windows Subsystem For Linux (WSLv2) 1,WinR,运行ver命令: 我的是Win11系统,但版本还是10.xx的。要求 Windows 10 builds > 18917,才能使用WSLv2。 如果需要版本升级,请参照&#xf…

C++速通LeetCode中等第11题-除自身以外数组的乘积

方法一&#xff1a;前缀积乘后缀积 class Solution { public:vector<int> productExceptSelf(vector<int>& nums) {int length nums.size();vector<int> answer(length);// answer[i] 表示索引 i 左侧所有元素的乘积// 因为索引为 0 的元素左侧没有元素…

多语言长文本 AI 关键字提取 API 数据接口

多语言长文本 AI 关键字提取 API 数据接口 AI / 文本 专有模型极速提取 多语言长文本 / 实时语料库。 1. 产品功能 支持长文本关键词提取&#xff1b;多语言关键词识别&#xff1b;基于 AI 模型&#xff0c;提取精准关键词&#xff1b;全接口支持 HTTPS&#xff08;TLS v1.0 …

C一语言—动态内存管理

目录 一、为什么要有动态内存管理 二、malloc和free &#xff08;2.1&#xff09;malloc &#xff08;2.2&#xff09;free 三、calloc和realloc &#xff08;3.1&#xff09;calloc &#xff08;3.2&#xff09;realloc 四、常见的动态内存的错误&#xff08;举例均为错…

Java设计模式(工厂模式)——抽象工厂模式(完整详解,附有代码+案例)

文章目录 5.4 抽象工厂模式5.4.1 概述5.4.2 结构5.4.3 实现5.4.4 优缺点5.4.5 使用场景 5.4 抽象工厂模式 5.4.1 概述 是一种为访问类提供一个创建一组相关或相互依赖对象的接口&#xff0c;且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。 同族的…