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

文章目录

  • 张量
    • 张量在深度学习领域的定义
    • 张量的基本属性
    • 使用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.mzph.cn/news/18322.shtml

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

相关文章

uniapp 微信小程序:v-model双向绑定问题(自定义 props 名无效)

uniapp 微信小程序:v-model双向绑定问题(自定义 props 名无效) 前言问题双向绑定示例使用 v-model使用 v-bind v-on使用 sync 修饰符 参考资料 前言 VUE中父子组件传递数据的基本套路: 父传子 props子传父 this.$emit(事件名, …

如何安装、部署、启动Jenkins

一、测试环境 Linux系统 Centos 7 二、安装步骤: 1、安装jdk 我安装的是jdk8,此处就不多说了,自己百度哈,很简单 2、安装jenkins 首先依次执行如下三个命令: 2.1、导入镜像: [rootcentos7 ~]# sudo …

华为OD机考真题--单词接龙--带答案

2023华为OD统一考试(AB卷)题库清单-带答案(持续更新)or2023年华为OD真题机考题库大全-带答案(持续更新) 题目描述: 单词接龙的规则是: 用于接龙的单词首字母必须要前一个单词的尾字母…

Python(五十八)什么是字典

❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

tcpdump网络抓包工具的使用

tcpdump 是一款用在linux系统上的网络抓包工具 1、 基本语法 tcpdump 的常用参数如下: tcpdump -i eth0 -nn -s0 -v port 80-i : 选择要捕获的接口,通常是以太网卡或无线网卡,也可以是 vlan 或其他特殊接口。如果该系统上只有一个网络接口&…

学习C#编写上位机的基础知识和入门步骤:

00001. 掌握C#编程语言基础和.NET框架的使用。 00002. 学习WinForm窗体应用程序开发技术,包括控件的使用和事件驱动编程。 00003. 熟悉基本的数据结构和算法知识,如链表、栈、队列等。 00004. 理解串口通信协议和通信方法,用于与底层硬件设…

elb 直接配置到后端服务器组

出现上图报错的原因是,前面elb配置了https证书,后端的nginx也配置了证书,导致冲突。 需要修改后端的nginx配置文件,将证书配置注释掉。 如果出现健康检查异常,需要在对应服务器的安全组上配置elb所在的网段的访问权限…

CTFSHOW php 特性

web89 数组绕过正则 include("flag.php"); highlight_file(__FILE__);if(isset($_GET[num])){$num $_GET[num]; get numif(preg_match("/[0-9]/", $num)){ 是数字 就输出 nodie("no no no!");}if(intval($num)){ 如果是存在整数 输出 flagecho …

formatter的用法,深拷贝, Object.assign 方法实战。

1. :formatter的用法 :formatter 接受一个函数作为参数&#xff0c;这个函数有三个参数&#xff1a;row&#xff0c;column 和 cellValue。row 是当前行的数据&#xff0c;column 是当前列的数据&#xff0c;cellValue 是当前单元格的值。 <el-table-column prop"SYS…

6.7 冒泡排序

6.7 冒泡排序 冒泡排序无疑是最为出名的排序算法之一&#xff0c;总共有八大排序&#xff01; 冒泡排序的代码还是相当简单的&#xff0c;两层循环&#xff0c;外层冒泡轮数&#xff0c;里层依次比较&#xff0c;江湖中人人尽皆知 我们看到嵌套循环&#xff0c;英爱立马就可以…

sql入门基础-2

Dml语句 对数据的增删改查 关键字 Insert增 Update删 Delete改 添加数据 给指定字段添加数据 Insert into 表明 (字段名1&#xff0c;字段名2) values&#xff08;值1&#xff0c;值2&#xff09;; 给全部字段添加数据--(根据位置对应添加到字段下) Insert into 表名 values…

基于ESP8266+网络调试助手点灯实验

文章目录 ESP8266串口wifi模块简介实验准备硬件接线程序下载注意事项总结 ESP8266串口wifi模块 简介 ESP8266 是一种低成本、高性能的 Wi-Fi 模块&#xff0c;内置了 TCP/IP 协议栈&#xff0c;它可以作为单独的无线网络控制器&#xff0c;或者与其他微控制器进行串口通信。它…

mongotop跟踪Mongodb集合读取和写入数据

版本控制 从 MongoDB 4.4 开始&#xff0c;MongoDB 数据库工具现在与 MongoDB 服务器分开发布&#xff0c;并使用自己的版本控制&#xff0c;初始版本为100.0.0. 此前&#xff0c;这些工具与 MongoDB 服务器一起发布&#xff0c;并使用匹配的版本控制。 兼容性 mongotop 版本…

STM SPI学习

SPI介绍 SPI&#xff1a;串行外设设备接口&#xff08;Serial Peripheral Interface&#xff09;&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步通信总线。 IIC总线与SPI总线对比 全双工&#xff1a;同一时刻既能接收数据&#xff0c;也能发送数据。 CS&…

中国最赚钱公司出炉

7月25日&#xff0c;2023年《财富》中国500强排行榜正式发布。国家电网以5300亿美元的营收位居榜首&#xff0c;中国石油和中国石化分列第二和第三。工商银行则成为最赚钱的公司。 图片来源&#xff1a;财富FORTUNE 1中国500强TOP10 数据显示&#xff0c;今年500家上榜的中国…

自然语言处理(NLP)技术

自然语言处理技术是一种人工智能技术&#xff0c;它的目标是使计算机能够理解、分析、处理和生成自然语言&#xff08;人类使用的语言&#xff09;。NLP技术包括文本分类、情感分析、机器翻译、语音识别、语音合成、信息检索、信息抽取、问答系统等。NLP技术的应用非常广泛&…

Linux 用户和权限

一、root 用户 root 用户(超级管理员) 无论是windows、Macos、Linux均采用多用户的管理模式进行权限管理。在Linux系统中&#xff0c;拥有最大权限的账户名为&#xff1a;root (超级管理员)。 root用户拥有最大的系统操作权限&#xff0c;而普通用户在许多地方的权限是受限的。…

Keepalived 在CentOS 7安装并配置监听MySQL双主

keepalived安装 MySQL双主配置请看这里&#xff1a;https://tongyao.blog.csdn.net/article/details/132016200?spm1001.2014.3001.5502 128、129两台服务器安装步骤相同&#xff0c;配置文件不同&#xff0c;下面有介绍。 1.安装相关依赖包&#xff0c;并下载keepalived安…

Mybatis分页的实现 及PageHelper的使用

目录 一.分页的原理 二.Mybatis实现 三.PageHelper 第⼀步&#xff1a;引⼊依赖 第⼆步&#xff1a;在mybatis-config.xml⽂件中配置插件 第三步&#xff1a;编写Java代码 一.分页的原理 pageindex 页数 pagindex 页内数据 (pageindex-1)*pagesize,pagesize SELECT * FRO…