从零开始深度学习:(1)张量的常用操作

孩子们,懒大王回来了!

正如标题所说,今天我们继续开始新的篇章,我们要开始高强度学习深度学习的相关内容,这个专栏内容较多、全是干货,我们还会在合适的地方进行拓展一些额外的语法或者别的相关知识,并且保证会持续更新,大家坐稳了这就出发!由于不方便插入jupyter代码,所以可能会包含很多图片。

首先,预先善其事必先利其器,所以我们第一章从张量开始讲起。 需要事先说明的一点是我们这里主要使用的是pytorch的张量,实际上通用的深度学习框架都有张量这一数据结构,里面numpy中的array就很类似,但是由于只支持一些基础的函数功能,所以这里我们还是选择pytorch。

第一步当然是导入torch包,如果你不想再转到终端输入,我们也可以直接在jupyter notebook中输入下面命令,%pip 是在 Jupyter Notebook 中使用的一种特殊命令,它是一个 魔法命令。

  • %pip 会确保安装的包直接作用于当前 Jupyter Notebook 环境,不会影响到其他系统环境。
  • 使用 %pip 可以避免一些 pip 在 Jupyter Notebook 中运行时可能出现的路径或环境问题。
    %pip install torch
           

1.张量创建

PyTorch 提供的张量创建函数(如 torch.tensor())实际上可以接受多种类型的输入,具体来说,它支持:

  • 列表(list)
  • 元组(tuple)
  • NumPy 数组(numpy.ndarray)
  • 标量(scalar)
  • 其他张量(tensor)
#通过列表创建
torch.tensor([1,3])
#通过元组创建
torch.tensor((1,3))
#通过numpy创建
import numpy as np
a = np.array((1,2))
t = torch.tensor(a)

这里我们不列举出所有的方式了,需要说明的一点是这种多种创建方式并不是通过函数重载实现的,而是通过 参数类型的多态性Python 内部的动态类型机制 来支持的。这里我们拓展一下,具体谈一下实现方式。

1.类型检查:PyTorch 会根据传入的参数类型(如列表、元组、NumPy 数组等)来选择合适的张量构造方式。

2.内部转化:具体来说,对于列表和元组,PyTorch 会将其转换为张量,转换的过程是类似的。元组和列表在 Python 中都是可以迭代的序列类型,因而可以共用同样的创建张量的逻辑。

动态类型检查的原理:

动态类型检查 是指在程序运行时检查一个对象的类型,而不是在编译时。Python 是一种 动态类型 语言,这意味着变量不需要声明类型,类型检查发生在程序执行时,而不是在编译阶段进行检查。

在 Python 中,所有对象都包含一个指向其类型的指针。这意味着我们可以在运行时通过 type() 函数来获取对象的类型。例如:

a = [1, 2, 3]
print(type(a))  # <class 'list'>

b = (1, 2, 3)
print(type(b))  # <class 'tuple'>

在运行时,Python 会根据变量 ab 的实际值来确定它们的类型。

当你传递一个参数到函数或方法中时,Python 可以动态地检查该参数的类型,进而决定如何处理该参数。例如,torch.tensor() 会检查传入的参数类型,并根据类型选择适当的处理方式。

下面是pytorch如何运作的一个简化版示例:

import torch

def create_tensor(data):
    if isinstance(data, list):
        print("数据是一个列表")
        return torch.tensor(data)
    elif isinstance(data, tuple):
        print("数据是一个元组")
        return torch.tensor(data)
    elif isinstance(data, torch.Tensor):
        print("数据是一个张量")
        return data.clone()  # 克隆现有张量
    else:
        raise TypeError("不支持该类型的输入")

# 测试
tensor_from_list = create_tensor([1, 2, 3])
tensor_from_tuple = create_tensor((4, 5, 6))

补充一下:isinstance() 是 Python 的一个内置函数,用于检查一个对象是否是某个特定类或类的子类的实例。这个函数通常用于动态类型检查,它返回一个布尔值:如果对象是指定类型或其子类的实例,返回 True;否则返回 False

2.张量的类型

如果我们运行最后一个通过numpy创建的代码会发现,多了个dtype,如下图:

这是因为如果用前两种方法创建tensor默认是长整型int64,这里使用numpy变成了int32所以显示出来了。我们可以通过.dtype来查看类型,会发现一个规律:整数型array创建默认32位,tensor默认64位,浮点数array默认float是64位,tensor默认float是32位。

所以我们也可以在创建的时候设置类型参数:

t0 = torch.tensor([1.14,5.14],dtype = torch.float64)

需要特别注意的一点是当我们用numpy创建的时候张量类型会和里面的numpy的类型一致,如图:

这里tensor默认是32位,但是由于array默认是64位,所以最后输出还是float64

除此之外我们还可以创建bool类型:

t1 = torch.tensor([True,False])
t1.dtype

3.张量类型的转化

如上图输出所示,三种常用类型之间都是可以互相转化的,而且默认会朝着数据量更多的那个方向转化。当然我们也可以直接进行转化,如下图:

我们会发现,当我们转化之后并没有改变t的属性,这是因为返回的是t的一个副本,并没有对原张量进行修改,如果你想对原张量进行修改也可以使用加上 _ 的方法,比如 .float_().double_()

4.张量的维度

我们可以通过调用常用的方法和属性来查看张量的维度大小维度等信息,如下图:

需要注意的是在pytorch中和numpy不同,size方法和shape属性返回的结果是一样的

这里的len函数也可以返回维度信息,而numel返回底层有多少个元素

高维张量:

如上图所示,我们创建了一个t3张量包括了两个numpy数组,我们这里主要解释一下shape属性

shape返回的[2,2,3]意思是包含了两个小矩阵,每个小矩阵是二行三列

维度的形变

如图所示,常用到的就flatten和reshape两个方法

flatten方法顾名思义就是将一个张量拉平,reshape可以将张量改变成你想要的形状,需要注意的是我们可以看到reshape输入的参数和返回的size方法结果一致。说白了就是你想要返回什么样的size就输入什么参数,因此这里我们也可以调用reshape来打到flatten的作用。

5.常见特殊张量的创建

6.不同类型的转化

需要注意一点的是使用list函数转化为列表,里面包含的是0维张量而不是数值,而item方法就是把0维张量转化为数值。

7.张量的拷贝

我们通过修改可以发现t4和t5是指向同一个地址空间的,也就是常说的浅拷贝,如果我们要指向不同的地址空间的深拷贝,调用clone方法即可:

8.张量的索引

1.一维张量索引

和python的索引用法几乎一样,如下图:

如果冒号前后没有数字表明索引这一整片区域,唯一需要注意的是这里的步长不能为负数。

2.二维张量索引

在搞懂二维之后,三维甚至高维都是同样的索引方法,所以这里就不再写三维的了。

3.张量的函数索引

9.view方法

view顾名思义就是视图的意思,把原对象以另一种方式表达就叫视图。需要注意的是视图和原对象共用同一片存储空间,也就是前面说的浅拷贝。我们发现当我们修改了原对象之后,视图也发生了改变,这就是浅拷贝的证明。

10.张量的切分

1.chunk方法

chunk方法可以在指定维度上进行等量切分的操作,例如将t3二等分为两个小tensor,如果不能完全等分可能会返回意外的结果,例如下面这个不能三等分,返回的是二等分的。需要额外注意的是这里返回的同样也是视图。

2.split方法

如图,split方法可以完成自定义切分,如果第二个参数只有一个数字表示每段的大小,也可以是一个列表,例如最后那样表示第一份一个,第二份两个。

11张量的合并

如上图所示合并操作有两种,一种是拼接,一种是堆叠。堆叠的要求更加高一点,要求两个张量形状一样,并且放到一个更高一维的张量中。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Idea】编译Spring源码 read timeout 问题

Idea现在是大家工作中用的比较多的开发工具&#xff0c;尤其是做java开发的&#xff0c;那么做java开发&#xff0c;了解spring框架源码是提高自己技能水平的一个方式&#xff0c;所以会从spring 官网下载源码&#xff0c;导入到 Idea 工具并编译&#xff0c;但是发现build的时…

C++|CRC校验总结

参考&#xff1a; Vector - CAPL - CRC算法介绍 开发工具 > CRC校验工具 文章目录 简介CRC-8CRC-16CRC-32 简介 循环冗余校验&#xff08;Cyclic Redundancy Check&#xff0c;简称CRC&#xff09;是一种数据校验算法&#xff0c;广泛用于检测数据传输或存储过程中的错误。…

【Linux】11.Linux基础开发工具使用(4)

文章目录 3. Linux调试器-gdb使用3.1 背景3.2 下载安装3.3 使用gdb查询3.4 开始使用 3. Linux调试器-gdb使用 3.1 背景 程序的发布方式有两种&#xff0c;debug模式和release模式 Linux gcc/g出来的二进制程序&#xff0c;默认是release模式 要使用gdb调试&#xff0c;必须…

windows系统“acadres.dll”文件丢失或错误导致游戏运行异常如何解决?windows系统DLL文件修复方法

acadres.dll是存放在windows系统中的一个重要dll文件&#xff0c;缺少它可能会造成部分游戏不能正常运行。当你的电脑弹出提示“无法找到acadres.dll”或“计算机缺少acadres.dll”等错误问题&#xff0c;请不用担心&#xff0c;我们将深入解析DLL文件错误的成因&#xff0c;并…

小程序如何引入腾讯位置服务

小程序如何引入腾讯位置服务 1.添加服务 登录 微信公众平台 注意&#xff1a;小程序要企业版的 第三方服务 -> 服务 -> 开发者资源 -> 开通腾讯位置服务 在设置 -> 第三方设置 中可以看到开通的服务&#xff0c;如果没有就在插件管理中添加插件 2.腾讯位置服务…

【AIGC-ChatGPT进阶提示词指令】心灵修复师:一个基于情感共鸣的智慧对话系统设计

引言 在当今快节奏的生活中&#xff0c;心理健康问题日益凸显。如何借助人工智能技术&#xff0c;构建一个既富有温度又专业可靠的心理支持系统&#xff0c;成为了一个值得深入探讨的课题。本文将详细介绍一个名为"心灵修复师"的对话系统设计&#xff0c;这个系统通…

计算机网络 (44)电子邮件

一、概述 电子邮件&#xff08;Electronic Mail&#xff0c;简称E-mail&#xff09;是因特网上最早流行的应用之一&#xff0c;并且至今仍然是因特网上最重要、最实用的应用之一。它利用计算机技术和互联网&#xff0c;实现了信息的快速、便捷传递。与传统的邮政系统相比&#…

《leetcode-runner》【图解】如何手搓一个debug调试器——调试程序【JDI开发】【万字详解】

前文&#xff1a; 《leetcode-runner》如何手搓一个debug调试器——引言 《leetcode-runner》如何手搓一个debug调试器——架构 《leetcode-runner》如何手搓一个debug调试器——指令系统 本文主要聚焦于如何编写调试程序 背景 在leetcode算法背景下&#xff0c;用户只编写了…

小米vela系统(基于开源nuttx内核)——openvela开源项目

前言 在 2024 年 12 月 27 日的小米「人车家全生态」合作伙伴大会上&#xff0c;小米宣布全面开源 Vela 操作系统。同时&#xff0c;OpenVela 项目正式上线 GitHub 和 Gitee&#xff0c;采用的是比较宽松的 Apache 2.0 协议&#xff0c;这意味着全球的开发者都可以参与到 Vela…

【 PID 算法 】PID 算法基础

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

使用 WPF 和 C# 绘制覆盖网格的 3D 表面

此示例展示了如何使用 C# 代码和 XAML 绘制覆盖有网格的 3D 表面。示例使用 WPF 和 C# 将纹理应用于三角形展示了如何将纹理应用于三角形。此示例只是使用该技术将包含大网格的位图应用于表面。 在类级别&#xff0c;程序使用以下代码来定义将点的 X 和 Z 坐标映射到 0.0 - 1.…

为深度学习创建PyTorch张量 - 最佳选项

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

Linux下源码编译安装Nginx1.24及服务脚本实战

1、下载Nginx [rootlocalhost ~]# wget -c https://nginx.org/download/nginx-1.24.0.tar.gz2、解压 [rootlocalhost ~]# tar xf nginx-1.24.0.tar.gz -C /usr/local/src/3、安装依赖 [rootlocalhost ~]# yum install gcc gcc-c make pcre-devel openssl-devel -y4、 准备 N…

4、dockerfile实现lnmp和elk

dockerfile实现lnmp 使用dockerfile n&#xff1a;nginx&#xff0c;172.111.0.10 m&#xff1a;mysql&#xff0c;172.111.0.20 p&#xff1a;php&#xff0c;172.111.0.30 安装配置nginx 1、准备好nginx和wordpress安装包 2、配置dockerfile 3、配置nginx主配置文件ngin…

一文通透OpenVLA及其源码剖析——基于Prismatic VLM(SigLIP、DinoV2、Llama 2)及离散化动作预测

前言 当对机器人动作策略的预测越来越成熟稳定之后(比如ACT、比如扩散策略diffusion policy)&#xff0c;为了让机器人可以拥有更好的泛化能力&#xff0c;比较典型的途径之一便是基于预训练过的大语言模型中的广泛知识&#xff0c;然后加一个policy head(当然&#xff0c;一开…

《操作系统真象还原》第十三章——磁盘驱动程序

文件系统磁盘创建 创建磁盘 进入bochs安装目录&#xff0c;输入以下命令 ./bin/bximage 然后按照以下步骤创建硬盘 修改硬盘配置 vim boot.disk 添加以下代码行 ata0-slave: typedisk, path"hd80M.img", modeflat,cylinders162,heads16,spt63 完整配置如下 …

快速、可靠且高性价比的定制IP模式提升芯片设计公司竞争力

作者&#xff1a;Karthik Gopal&#xff0c;SmartDV Technologies亚洲区总经理 智权半导体科技&#xff08;厦门&#xff09;有限公司总经理 无论是在出货量巨大的消费电子市场&#xff0c;还是针对特定应用的细分芯片市场&#xff0c;差异化芯片设计带来的定制化需求也在芯片…

v-bind操作class

v-bind操作class 参考文献&#xff1a; Vue的快速上手 Vue指令上 Vue指令下 Vue指令的综合案例 指令的修饰符 文章目录 v-bind操作classv-bind对于样式控制的增强操作class案例(tab导航高亮)操作style操作style案例 结语 博客主页: He guolin-CSDN博客 关注我一起学习&#…

Kubernetes1.28 编译 kubeadm修改证书有效期到 100年.并更新k8s集群证书

文章目录 前言一、资源准备1. 下载对应源码2.安装编译工具3.安装并设置golang 二、修改证书有效期1.修改证书有效期2.修改 CA 证书有效期 三、编译kubeadm四、使用新kubeadm方式1.当部署新集群时,使用该kubeadm进行初始化2.替换现有集群kubeadm操作 前言 kubeadm 默认证书为一…

HarmonyOS NEXT应用开发边学边玩系列:从零实现一影视APP (三、影视搜索页功能实现)

在HarmonyOS NEXT开发环境中&#xff0c;我们可以使用nutpi/axios库来简化网络请求的操作。本文将展示如何使用HarmonyOS NEXT框架和nutpi/axios库&#xff0c;从零开始实现一个简单的影视APP&#xff0c;主要关注影视搜索页的功能实现。 为什么选择nutpi/axios&#xff1f; n…