深度学习入门 ---- 张量(Tensor)

news2024/12/24 0:00:29

文章目录

  • 张量
    • 张量在深度学习领域的定义
    • 张量的基本属性
    • 使用PyTorch
      • 安装PyTorch
      • 查看安装版本
    • 创建张量
    • 常用函数
      • 四种创建张量的方式和区别
    • 四则运算

张量

张量在深度学习领域的定义

张量(tensor)是多维数组,目的是把向量、矩阵推向更高的维度。
有n维度就叫做n维张量

在这里插入图片描述
其实在实际中,并不需要过分的关注张量的定义,只需要明白张量是多维数组就行

张量的基本属性

主要有三个属性:秩、轴、形状

  • 秩:主要告诉我们是张量的维度,其实就是告诉我们是几维向量,通过多少个索引就可以访问到元素。
  • 轴:在张量中,轴是指张量的一个维度。当处理多维数据时,每个维度都可以被称为一个轴。通常,第一个轴称为0轴(或轴0),第二个轴称为1轴(或轴1),以此类推。
  • 形状:形状是指张量在每个轴上的维度大小。它是一个由整数组成的元组,表示张量沿着每个轴的大小。

关于这些后面的例子中会提到

使用PyTorch

在这里插入图片描述

安装PyTorch

PyTorch官网:https://pytorch.org/
根据自己的需求和电脑的硬件情况进行选择,复制下方的pip命令安装即可
在官网中

安装GPU版本的不需要再额外安装CUDA,现在的安装PyTorch会自带安装CUDA。

查看安装版本

print(torch.__version__) # 2.0.1+cpu  版本号
print(torch.cuda.is_available()) # False   # 没有GPU,如果有则返回True

创建张量

默认创建的张量是在CPU下创建

import torch 
# tensor 张量
t = torch.tensor([1,2,3])  # tensor([1, 2, 3])
print(t)

将张量转移到GPU下

# 使用gpu
t = t.cuda()  # tensor([1, 2, 3], device='cuda:0')
print(t)

直接在GPU下创建张量

t = torch.tensor([1, 2, 3]).to('cuda')  # tensor([1, 2, 3], device='cuda:0')

常用函数

import torch
# 创建一个二维张量
t = torch.tensor([
    [1,2,3],
    [4,5,6],
    [7,8,9]
])
# 输出张量
print(t)

查看数据类型

print(type(t))

输出张量的形状

# 同样也可以理解为每一个轴的长度
print(t.shape)
# 两种方式返回内容一样
print(t.size())

改变形状

# 改变后形状要个原张量里面包含的元素数量一样多。
new_t = t.reshape((1,9))
print(new_t)

我们在使用改变形状的时候,在以前需要指定每一个轴的大小,这样还需要自己计算,比较麻烦,我们可以通过将其中一个参数设置为-1,让reshape自动计算其实际值

t.reshape(1,-1)  # 会根据t元素的个数和其他指定的参数自动计算-1代表的实际值

统计张量中元素的个数

# prod() 用于计算张量中所有元素的乘积
# item() 取出张量的值
print(torch.tensor(t.shape).prod().item())  # 思路:根据将所有轴的长度相乘,得出的结果就是元素的个数
print(t.numel()) # 直接返回元素的个数

压缩张量/解压缩张量

通常指的是对张量进行降维操作和恢复原始形状的操作
torch.squeeze() 压缩
torch.unsqueeze() 解压缩

print(t.reshape(1,12))
# tensor([[1., 1., 1., 1., 2., 2., 2., 2., 3., 3., 3., 3.]])
print(t.reshape(1,12).shape)
# torch.Size([1, 12])

# 压缩张量 
# 通过结构我们可以看看出,压缩张量,去除张量中维度大小为1的维度,从而降低张量的维度。如果在调用时不指定维度,则会去除所有大小为1的维度。这对于减少张量的冗余维度很有用。
print(t.reshape(1,12).squeeze())
# tensor([1., 1., 1., 1., 2., 2., 2., 2., 3., 3., 3., 3.])
print(t.reshape(1,12).squeeze().shape)
# torch.Size([12])

# 解压缩张量
print(t.reshape(1,12).squeeze().unsqueeze(dim=0))
# tensor([[1., 1., 1., 1., 2., 2., 2., 2., 3., 3., 3., 3.]])
print(t.reshape(1,12).squeeze().unsqueeze(dim=0).shape)
# torch.Size([1, 12])

四种创建张量的方式和区别

data = np.array([1,2,3])
  • 方式1 Tensor()类构造器函数
    t1 = torch.Tensor(data) 会自动将整数转成小数

  • 方式2 tensor工厂函数
    t2 = torch.tensor(data) 会根据输入的数据类型自动推断张量的数据类型

  • 方式3 as_tensor工厂函数
    t3 = torch.as_tensor(data)

  • 方式4 from_numpy工厂函数
    t4 = torch.from_numpy(data)

四种方式的区别:
前两种方式会生成一份新的数据,后两种是和原数据共享,numpy和torch之间切换非常快,数据共享,两者之间保存统一的内存指向
举例

# 修改data原数据
data[0] = 0
data[1] = 0
data[2] = 0

方式一和方式二生成的张量中的数据没有发生改变

# 张量中的数据没有发生改变
print(t1)  # tensor([1., 2., 3.])
print(t2)  # tensor([1, 2, 3], dtype=torch.int32)

方式三和方式四生成的张量中的数据随着np.array的数据发生改变

# 张量中的数据随着np.array的数据发生改变-
print(t3)  #  tensor([0, 0, 0], dtype=torch.int32)
print(t4)  #  tensor([0, 0, 0], dtype=torch.int32)

注:在刚开始学习时,将重心放在逻辑和代码的正确性上,不需要太关注性能

拼接操作

t1 = torch.tensor([
        [1, 2],
        [3, 4]
])
t2 = torch.tensor([
    [5, 6],
    [7, 8]
])

使用cat函数进行拼接

# dim 根据指定轴进行拼接
t1_2 = torch.cat((t1,t2),dim=0)
print(t1_2)
# 两种拼接方式,张量秩不发生改变
t1_2 = torch.cat((t1,t2),dim=1)
print(t1_2)

合并张量
使用stack将张量合并成更高维的张量

t1 = torch.tensor([
    [1,1,1,1],
    [1,1,1,1],
    [1,1,1,1],
    [1,1,1,1]
])
t2 = torch.tensor([
    [2,2,2,2],
    [2,2,2,2],
    [2,2,2,2],
    [2,2,2,2]
])
t3 = torch.tensor([
    [3,3,3,3],
    [3,3,3,3],
    [3,3,3,3],
    [3,3,3,3]
])
# 使用stack将张量合并成更高维的张量
t = torch.stack((t1,t2,t3))
print(t)
print(t.shape)
# torch.Size([3, 4, 4])

拉伸张量
将多维的张量拉伸到一维,主要有两个方式,reshapeflatten

print(t.reshape(-1))
print(t.flatten())
# 另外还有两个参数可选
# start_dim(可选):指定展平的起始维度。默认为0,表示从第0维开始展平。
# end_dim(可选):指定展平的结束维度。默认为-1,表示展平到最后一维。

四则运算

张量的四则运算和numpy中ndarray的运算一致,都使用了广播机制

张量和常量的四则运算

t1 = torch.tensor([[1,2,3,4],[5,6,7,8]])
print(t1+1)
print(t1.add(1))
# 减法
print(t1-1)
print(t1.sub(1))
# 乘法
print(t1*1)
print(t1.mul(1))
# 除法
print(t1/1)
print(t1.div(1))

张量之间的四则运算

当两个张量形状相同或可广播时,可以直接进行四则运算。如果张量形状不匹配,PyTorch会尝试自动进行广播操作,使得张量能够进行元素级别的四则运算。

import torch

# 创建两个示例张量
tensor1 = torch.tensor([[1, 2], [3, 4]])
tensor2 = torch.tensor([[5, 6], [7, 8]])

# 加法
add_result = tensor1 + tensor2
print(add_result)  # Output: tensor([[ 6,  8],
                   #         [10, 12]])
# 减法
subtract_result = tensor1 - tensor2
print(subtract_result)  # Output: tensor([[-4, -4],
                        #         [-4, -4]])
# 乘法
multiply_result = tensor1 * tensor2
print(multiply_result)  # Output: tensor([[ 5, 12],
                        #         [21, 32]])

# 除法
divide_result = tensor1 / tensor2
print(divide_result)  # Output: tensor([[0.2000, 0.3333],
                      #         [0.4286, 0.5000]])

需要注意的是,张量之间的四则运算是逐元素的,即对应位置的元素进行运算。此外,还要注意确保参与四则运算的张量形状是兼容的,或者能够进行广播操作,否则会引发运算错误。

广播机制的原理

当执行算术运算时,如果两个数组的形状不完全相同,但是符合一定的规则,那么广播机制会自动对其中一个或两个数组进行扩展,使得它们的形状能够匹配,从而实现逐元素的运算。

广播机制的优点

广播机制的好处在于,它允许我们在不创建额外副本的情况下执行运算,从而节省内存和提高运算效率。同时,它也使得我们可以更方便地处理不同形状的数据,例如在神经网络中处理批量数据或处理多维特征数据时

矩阵的乘法和除法 二维张量的点乘

矩阵乘法使用torch.matmul()函数或者@运算符,而矩阵除法则使用逆矩阵(或者伪逆矩阵)来实现。

矩阵乘法

import torch

# 创建两个示例矩阵
matrix1 = torch.tensor([[1, 2], [3, 4]])
matrix2 = torch.tensor([[5, 6], [7, 8]])

# 矩阵乘法
result = torch.matmul(matrix1, matrix2)
print(result)  # Output: tensor([[19, 22],
               #         [43, 50]])

# 或使用 @ 运算符
result = matrix1 @ matrix2
print(result)  # Output: tensor([[19, 22],
               #         [43, 50]])

# 这样也可以用
matrix1.matmul(matrix2)

矩阵除法

在线性代数中,通常没有直接的矩阵除法运算,而是使用逆矩阵(inverse matrix)或者伪逆矩阵(pseudoinverse matrix)来实现矩阵除法。在PyTorch中,可以使用torch.inverse()函数来计算逆矩阵,从而实现矩阵除法。

import torch

# 创建两个示例矩阵
matrix1 = torch.tensor([[1, 2], [3, 4]])
matrix2 = torch.tensor([[5, 6], [7, 8]])

# 计算矩阵2的逆矩阵
inverse_matrix2 = torch.inverse(matrix2)

# 矩阵除法,等价于 matrix1 @ inverse_matrix2
result = torch.matmul(matrix1, inverse_matrix2)
print(result)  # Output: tensor([[-4.0000,  4.0000],
               #         [ 6.5000, -3.5000]])

参考:https://deeplizard.com/learn/video/gZmobeGL0Yg
在这里插入图片描述

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

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

相关文章

Docker中CMD和ENTRYPOINT的区别

目录 一.CMD二.ENTRYPOINT三.总结 一.CMD CMD指令为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。类似于 RUN 指令,用于运行程序,但二者…

Java:JDK8之后新的时间(推荐使用) LocalDate、LocalTime、LocalDataTime 的相关API

更新后的时间分类 LocalDate 的相关API //0、获取本地日期对象 LocalDate ld LocalDate.now();//年月日 system.out.println(ld) ;//1、获取日期对象中的信息 int year ld.getYear();//年 int month ld.getMonthValue(); //月(1-12) int day ld.getDayOfMonth();//日 int d…

不用下软件,三维模型就可以实现在线浏览了!

对三维有一些了解的朋友都知道,目前很多三维模型网站基本都是以2D形式展示的,用户只能通过截取不同角度的视图来查看模型。如果用户想要实现模型动态预览,只能下载其模型文件,并在对应的三维软件中打开。现在,不需要下…

springBoot多数据源使用tdengine(3.0.7.1)+MySQL+mybatisPlus+druid连接池

一、安装部署 1、我这里使用的 3.0.7.1版本,因为我看3.x版本已经发布了一年了,增加了很多新的功能,而且3.x官方推荐,对于2.x的版本,官网都已经推荐进行升级到3.x,所以考虑到项目以后的发展,决定…

EMC VxRail E560 vusb0端口不断down和up问题

客户的一台VxRail E560报vusb0网卡故障,如下所示: 该端口是VxRail ESXi与iDRAC内部通信的网口,并没有连接外部网络。 在vobd.log日志中,可以看到vusb0不断在down和up的信息: 由于节点在2023年4月份进行了重装&am…

每日一题8.2 2536

2536. 子矩阵元素加 1 给你一个正整数 n ,表示最初有一个 n x n 、下标从 0 开始的整数矩阵 mat ,矩阵中填满了 0 。 另给你一个二维整数数组 query 。针对每个查询 query[i] [row1i, col1i, row2i, col2i] ,请你执行下述操作:…

超出背包限制--潜水员

本题和之前的二维背包差不多&#xff0c;但是它可以做到超出体积的限制&#xff0c;本质上我们的状态转移方程其实和之前的差不多&#xff0c;f[i][j]min(f[i-1][j],f[i-1][j-v]w),超出的体积应该如何去计算&#xff0c;我们可以利用负数去计算&#xff0c;也就是i-v1<0||j-…

如何在烟草行业运用IPD?

从当前的世界烟草行业来看&#xff0c;烟草经济的发展十分迅速&#xff0c;中国是烟草生产与消费第一大国&#xff0c;每年由我国生产与出售的烟草远销世界各地。与此同时&#xff0c;中国烟草行业的集中度越来越高&#xff0c;企业的数量与规模稳步上升&#xff0c;行业迈向规…

Flink - sink算子

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 文章目录 1. Kafka_Sink 2. Kafka_Sink - 自定义序列化器 3. Redis_Sink_String 4. Redis_Sink_list 5. Redis_Sink_set 6. Redis_Sink_hash 7. 有界流数据写入到ES 8. 无界流数据写入到ES 9. 自定…

nodejs环境部署

1.前言 前端的打包必须要使用nodejs环境 2.部署 下载安装包&#xff0c;在下面的路径中找到适合自己项目合适的版本在下载&#xff0c;可以问一下前端开发人员 路径&#xff1a;Index of /dist/ 我这里是下载了14.21.3版本的nodejs环境,上传到需要部署的主机中 mkdir /opt…

制砖机系统比例控制阀放大器

制砖机系统是一种生产砖块的机器设备系统。该系统由多个部分组成&#xff0c;包括压力系统、模具和振动系统、烘干和烧制系统等。压力系统是制砖机的主要组成部分之一&#xff0c;它通过压力将原料压缩成一定形状和尺寸的块状&#xff0c;然后经过烘干和烧制等步骤&#xff0c;…

【嵌入式系统开发实训】学生实验报告

一、实验内容 1、过程考核60分&#xff1a; &#xff08;1&#xff09;顺序点亮3个LED灯&#xff08;分数&#xff1a;10分&#xff09;&#xff1b; &#xff08;2&#xff09;按键顺序点亮3个LED灯&#xff08;分数&#xff1a;10分&#xff09;&#xff1b; &#xff08;3&a…

恒运资本:炒股知识有用吗?

炒股是指通过购买和出售股票来赚取差价的一种出资行为。在现代社会&#xff0c;炒股已经成为许多人重视的话题。然而&#xff0c;有些人以为炒股常识是非常有用的&#xff0c;而另一些人则以为炒股常识并不有用。那么&#xff0c;炒股常识终究有多大的用途呢&#xff1f;本文将…

【NLP概念源和流】 06-编码器-解码器模型(6/20 部分)

一、说明 在机器翻译等任务中,我们必须从一系列输入词映射到一系列输出词。读者必须注意,这与“序列标记”不同,在“序列标记”中,该任务是将序列中的每个单词映射到预定义的类,如词性或命名实体任务。 作者生成 在上面的

实现本地上传、FTP上传、阿里云OSS上传三者合一处理

1、选项模式【Options】的处理 文件上传处理应该由程序进行配置&#xff0c;决定使用那种方式&#xff0c;那么这里面我们为了弹性化处理&#xff0c; 在文件上传模块中采用选项模式【Options】处理常规上传和FTP文件上传的配置参数信息。 微软引入选项模式,它是用于配置框架…

宇凡微2.4g遥控船开发方案,采用合封芯片

2.4GHz遥控船的开发方案是一个有趣且具有挑战性的项目。这样的遥控船可以通过无线2.4GHz频率进行远程控制&#xff0c;让用户在池塘或湖泊上畅游。以下是一个简要的2.4GHz遥控船开发方案&#xff1a; 基本构想如下 mcu驱动两个小电机&#xff0c;小电机上安装两个螺旋桨&#…

三、JVM-如何判断对象已死问题

内存模型以及如何判定对象已死问题 体验与验证 2.4.5.1 使用visualvm visualgc插件下载链接 &#xff1a;https://visualvm.github.io/pluginscenters.html 选择对应JDK版本链接—>Tools—>Visual GC 若上述链接找不到合适的&#xff0c;大家也可以自己在网上下载对应…

聊聊虚拟定位工具新宠儿:AnyGo的原理与识别

市面上已经有很多基于位置服务的应用场景&#xff0c;如运动品类应用基于地理位置生成运动轨迹&#xff0c;企业办公应用基于定位信息进行打卡&#xff0c;游戏品类应用基于位置信息开发区域排名&#xff0c;电商品类应用基于位置发放区域性优惠券等等。在黑灰产嗅探到背后的商…

自然语言处理学习笔记(二)————语料库与开源工具

目录 1.语料库 2.语料库建设 &#xff08;1&#xff09;规范制定 &#xff08;2&#xff09;人员培训 &#xff08;3&#xff09;人工标注 3.中文处理中的常见语料库 &#xff08;1&#xff09;中文分词语料库 &#xff08;2&#xff09;词性标注语料库 &#xff08;3…

Elasticsearch:语义搜索 - Semantic Search in python

当 OpenAI 于 2022 年 11 月发布 ChatGPT 时&#xff0c;引发了人们对人工智能和机器学习的新一波兴趣。 尽管必要的技术创新已经出现了近十年&#xff0c;而且基本原理的历史甚至更早&#xff0c;但这种巨大的转变引发了各种发展的“寒武纪大爆炸”&#xff0c;特别是在大型语…