深度学习:张量 介绍

张量[1]是向量和矩阵到 n 维的推广。了解它们如何相互作用是机器学习的基础。

简介

虽然张量看起来是复杂的对象,但它们可以理解为向量和矩阵的集合。理解向量和矩阵对于理解张量至关重要。

向量是元素的一维列表:

alt

矩阵是向量的二维列表:

alt

下标表示(行,列)。考虑矩阵的另一种方式是用向量作为元素的向量。请注意,它们通常用大写字母表示。

3D 张量可以被视为三维矩阵列表:

alt

考虑 3D 张量的另一种方式是使用矩阵作为元素的向量。请注意,在本文中它们是用书法大写字母标注的。

4D 张量可以被认为是 3D 张量的四维列表:

alt

考虑 4D 张量的另一种方式是使用 3D 张量作为其元素的向量。这些可能会变得越来越复杂,但这是继续使用张量进行运算所必需的程度。

向量运算

alt

假设这些是相同长度的向量,i。接下来的操作主要是按元素进行的。这意味着每个向量中的相应元素被一起操作。

加法

alt
import torch

x = torch.tensor([135])
y = torch.tensor([374])

x + y

# tensor([ 4, 10,  9])

减法

alt
x = torch.tensor([135])
y = torch.tensor([374])

x - y

# tensor([-2, -4,  1])

点乘

alt

这也可以用求和来表示:

alt
x = torch.tensor([135])
y = torch.tensor([374])

torch.dot(x, y) # 1*3 + 3*7 + 5*4 = 3 + 21 + 20 = 44

# tensor(44)

这也可以用 x @ y 来执行。点积的输出是一个标量。它不返回向量。

Hadamard(乘法)

alt

Hadamard 乘积用于执行逐元素乘法并返回一个向量。

x = torch.tensor([135])
y = torch.tensor([374])

x * y

# tensor([ 3, 21, 20])

标量乘法

alt

k 是标量,在大多数情况下是实数。

k = 5
x = torch.tensor([135])

k * x

# tensor([ 5, 15, 25])

由于 k 可以是分数,因此这也可以被视为标量除法。

矩阵乘法

请记住,矩阵是向量的集合。相同的操作适用于向量,但在涉及行和列时还有一些规则需要注意。

假设如下,其中 X 和 Y 的形状为 (4,3):

alt

加法

alt
X = torch.tensor([[135],
                  [361],
                  [685],
                  [732]])

Y = torch.tensor([[632],
                  [854],
                  [317],
                  [183]])

X + Y

# tensor([[ 7,  6,  7],
        [1111,  5],
        [ 9,  912],
        [ 811,  5]])

减法

alt
X = torch.tensor([[135],
                  [361],
                  [685],
                  [732]])

Y = torch.tensor([[632],
                  [854],
                  [317],
                  [183]])

X - Y

# tensor([[-5,  0,  3],
        [-5,  1-3],
        [ 3,  7-2],
        [ 6-5-1]])

点积

alt

在执行矩阵乘法时,重要的是要将矩阵视为由向量组成。通过这个视图,就可以清楚如何在矩阵上执行点积。发生乘法的唯一方法是第一个矩阵中的行数与第二个矩阵中的列数匹配。这导致:

  • (m, n) x (n, r) = (m, r)

如果情况并非如此,则必须转置其中一个矩阵以适应该顺序;这会切换行和列,但保留点积的向量。

在上图中,很明显,左侧矩阵中的每个向量(或行)都乘以第二个矩阵中的每个向量(或列)。因此,在此示例中,A 中的每个向量必须与 B 中的每个向量相乘,从而产生 16 个点积。

X = torch.tensor([[135],
                  [361],
                  [685],
                  [732]])

Y = torch.tensor([[632],
                  [854],
                  [317],
                  [183]])

X.matmul(Y.T) # X @ Y.T

# tensor([[ 25,  43,  41,  40],
        [ 38,  58,  22,  54],
        [ 70108,  61,  85],
        [ 55,  79,  38,  37]])

Hadamard 积

alt

Hadamard 乘积是逐元素乘法,因此其执行方式与加法和减法相同。

X = torch.tensor([[135],
                  [361],
                  [685],
                  [732]])

Y = torch.tensor([[632],
                  [854],
                  [317],
                  [183]])

X * Y

# tensor([[ 6,  9, 10],
        [2430,  4],
        [18,  835],
        [ 724,  6]])

标量乘法

alt
k = 5
X = torch.tensor([[135],
                  [361],
                  [685],
                  [732]])

k * X

# tensor([[ 5, 15, 25],
        [1530,  5],
        [304025],
        [351510]])

三维张量运算

张量运算要求两个张量具有相同的大小,除非正在执行点积。

对于本节中的逐元素运算,假设两个张量的形状为 (3, 3, 2)。这意味着两个张量都包含三个 (3,2) 矩阵。如下所示:

import torch

gen = torch.Generator().manual_seed(2147483647)

X = torch.randint(010, (332), generator=gen)
Y = torch.randint(010, (332), generator=gen)

X = tensor([[[14],
             [92],
             [30]],

            [[46],
             [77],
             [15]],

            [[68],
             [14],
             [49]]])

Y = tensor([[[80],
             [36],
             [60]],

            [[91],
             [00],
             [22]],

            [[71],
             [81],
             [90]]])

加法

加法是按元素进行的,并且按预期执行。每个张量中对应的元素相互相加。

X + Y

tensor([[[ 9,  4],
         [12,  8],
         [ 9,  0]],

        [[13,  7],
         [ 7,  7],
         [ 3,  7]],

        [[13,  9],
         [ 9,  5],
         [13,  9]]])

减法

减法也是按元素进行的并且按预期执行。

X - Y

tensor([[[-7,  4],
         [ 6-4],
         [-3,  0]],

        [[-5,  5],
         [ 7,  7],
         [-1,  3]],

        [[-1,  7],
         [-7,  3],
         [-5,  9]]])

点积

alt

张量乘法比二维中的张量乘法稍微复杂一些。之前,矩阵乘法只有满足以下条件才能发生:

  • (m, n) x (n, r) = (m, r)

在三个维度上,这仍然是一个要求。但是,第一个轴必须相同:

  • (z, m, n) x (z, n, r) = (z, m, r)

为什么是这样?嗯,如前所述,二维的点积主要是将向量彼此相乘。在三维中,重点是按矩阵相乘,然后对这些矩阵中的每个向量执行点积。

上图应该有助于解释这一点。将两个 3D 张量视为矩阵向量可能会有所帮助。由于点积是通过按元素相乘然后求和来执行的,因此首先发生的事情是每个矩阵与其相应的矩阵相乘。当这种情况发生时,矩阵乘法会导致矩阵中的每个向量与其他向量执行点积。从某种意义上说,它就像一个嵌套的点积。

为了使 和 彼此相乘,必须调换 的第二轴和第三轴。并且两者的大小均为 (3, 3, 2)。这意味着必须变成(3,2,3)。这可以使用 Y.permute(0, 2, 1) 来完成,它转置第二和第三轴。或者,可以使用 Y.transpose(1,2)。

print(Y.transpose(1,2))
print(Y.transpose(1,2).shape) # Y.permute(0, 2, 1)

tensor([[[836],
         [060]],

        [[902],
         [102]],

        [[789],
         [110]]])

torch.Size([323])

通过适当的调整大小,现在可以使用 matmul 或 @ 执行张量乘法。输出的形状应为 (3, 3, 2) x (3, 2, 3) = (3, 3, 3)。

X.matmul(Y.transpose(1,2)) # X @ Y.transpose(1,2)

tensor([[[ 827,  6],
         [723954],
         [24,  918]],

        [[42,  020],
         [70,  028],
         [14,  012]],

        [[505654],
         [1112,  9],
         [374136]]])

Hadamard 积

Hadamard 积的性能符合预期,并在 3D 张量的矩阵中按元素相乘。

X * Y

tensor([[[ 8,  0],
         [2712],
         [18,  0]],

        [[36,  6],
         [ 0,  0],
         [ 210]],

        [[42,  8],
         [ 8,  4],
         [36,  0]]])

标量乘法

标量乘法也按预期执行。

k = 5
k*X

tensor([[[ 520],
         [4510],
         [15,  0]],

        [[2030],
         [3535],
         [ 525]],

        [[3040],
         [ 520],
         [2045]]])

四维张量运算

四维张量运算仍然要求两个张量具有相同的大小。

对于本部分,假设形状为 (2, 3, 3, 2)。这意味着两个 4D 张量都包含两个 3D 张量,并且每个张量都包含三个 (3,2) 矩阵。如下所示:

import torch

gen = torch.Generator().manual_seed(2147483647)

X = torch.randint(010, (2332), generator=gen)
Y = torch.randint(010, (2332), generator=gen)

X
# 4d tensor
tensor([
# 3d tensor
        [
         # matrix 1
         [[14],
          [92],
          [30]],
         # matrix 2
         [[46],
          [77],
          [15]],
         # matrix 3
         [[68],
          [14],
          [49]]],

# 3d tensor
        [
         # matrix 1
         [[80],
          [36],
          [60]],
         # matrix 2
         [[91],
          [00],
          [22]],
         # matrix 3
         [[71],
          [81],
          [90]]]])

Y
# 4d tensor
tensor([
# 3d tensor
        [
         # matrix 1 
         [[63],
          [64],
          [57]],
         # matrix 2
         [[37],
          [20],
          [51]],
         # matrix 3
         [[04],
          [08],
          [06]]],

# 3d tensor
        [
         # matrix 1
         [[05],
          [86],
          [10]],
         # matrix 2
         [[51],
          [16],
          [12]],
         # matrix 3
         [[60],
          [26],
          [15]]]])

加法

加法、减法和哈达玛积仍然按预期按元素执行。

X + Y

tensor([[[[ 7,  7],
          [15,  6],
          [ 8,  7]],

         [[ 713],
          [ 9,  7],
          [ 6,  6]],

         [[ 612],
          [ 112],
          [ 415]]],


        [[[ 8,  5],
          [1112],
          [ 7,  0]],

         [[14,  2],
          [ 1,  6],
          [ 3,  4]],

         [[13,  1],
          [10,  7],
          [10,  5]]]])

减法

X - Y

tensor([[[[-5,  1],
          [ 3-2],
          [-2-7]],

         [[ 1-1],
          [ 5,  7],
          [-4,  4]],

         [[ 6,  4],
          [ 1-4],
          [ 4,  3]]],


        [[[ 8-5],
          [-5,  0],
          [ 5,  0]],

         [[ 4,  0],
          [-1-6],
          [ 1,  0]],

         [[ 1,  1],
          [ 6-5],
          [ 8-5]]]])

点积

alt

在四维中,张量乘法将具有与三维和二维中相同的要求。它还需要第一轴和第二轴与两个张量匹配:

  • (c、z、m、n) x (c、z、n、r) = (c、z、m、r)

在三维空间中,进行矩阵乘法,然后进行向量之间的点积。相同的步骤将在四个维度中发生,但首先将每个 3D 张量与其相应的 3D 张量相乘。然后,它们的每个矩阵将相互相乘。最后,它们的向量将相互执行点积。这可以在上图中看到。

对于本例, 和 的大小为 (2, 3, 3, 2)。为了进行乘法运算,必须调换 的第三轴和第四轴。这可以按照与之前使用 Y.permute(0, 1, 3, 2) 或 Y.transpose(2,3) 相同的方式完成。转置后的形状为 (2, 3, 2, 3)。

结果的形状应为 (2, 3, 3, 2) x (2, 3, 2, 3) = (2,3,3,3)。这意味着将有两个 3D 张量,每个张量将包含三个 (3,3) 矩阵。这个结果可以使用 matmul 或 @ 获得。

X.matmul(Y.transpose(2,3)) # X @ Y.transpose(2,3)

tensor([[[[182233],
          [606259],
          [181815]],

         [[54,  826],
          [701442],
          [38,  210]],

         [[326448],
          [163224],
          [367254]]],


        [[[ 064,  8],
          [3060,  3],
          [ 048,  6]],

         [[461511],
          [ 0,  0,  0],
          [1214,  6]],

         [[422012],
          [482213],
          [5418,  9]]]])

Hadamard 积

X * Y

tensor([[[[ 612],
          [54,  8],
          [15,  0]],

         [[1242],
          [14,  0],
          [ 5,  5]],

         [[ 032],
          [ 032],
          [ 054]]],


        [[[ 0,  0],
          [2436],
          [ 6,  0]],

         [[45,  1],
          [ 0,  0],
          [ 2,  4]],

         [[42,  0],
          [16,  6],
          [ 9,  0]]]])

标量乘法

k = 5
k * X

tensor([[[[ 520],
          [4510],
          [15,  0]],

         [[2030],
          [3535],
          [ 525]],

         [[3040],
          [ 520],
          [2045]]],


        [[[40,  0],
          [1530],
          [30,  0]],

         [[45,  5],
          [ 0,  0],
          [1010]],

         [[35,  5],
          [40,  5],
          [45,  0]]]])

Reference

[1]

Source: https://medium.com/@hunter-j-phillips/a-simple-introduction-to-tensors-c4a8321efffc

本文由 mdnice 多平台发布

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

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

相关文章

unity button移动位置some values driven by canvas

1 可以在button父节点把限制取消勾选 2 在不动整个布局的情况下,只修改局部变量:忽略布局即可

【C++】list的介绍及使用 | 模拟实现list(万字详解)

目录 一、list的介绍及使用 什么是list? list的基本操作 增删查改 获取list元素 不常见操作的使用说明 ​编辑 接合splice ​编辑 移除remove 去重unique 二、模拟实现list 大框架 构造函数 尾插push_back 迭代器__list_iterator list的迭代器要如何…

2023年MathorCup高校数学建模挑战赛大数据挑战赛赛题浅析

比赛时长为期7天的妈杯大数据挑战赛如期开赛,为了帮助大家更好的选题,首先给大家带来赛题浅析,为了方便大家更好的选题。 赛道 A:基于计算机视觉的坑洼道路检测和识别 A题,图像处理类题目。这种题目的难度数模独一档…

TextureView和SurfaceView

1、Surface Surface对应了一块屏幕的缓冲区,每一个window对应一个Surface,任何View都是画在Surface上的,传统的View共享一块屏幕缓冲区,所有的绘制都必须在UI线程上进行。 2、SurfaceView 顾名思义就是Surface的View,…

Python爬虫网易云音乐,Tkinter制作音乐播放器

目录 一、效果展示 二、环境 三、实现过程 四、源码 一、效果展示 页面的美化以及功能还有待升级~ 先来说一下已有功能吧: 可以在搜索框中通过歌曲或歌手名称进行搜索,效果和在网易云官网搜索一样。 点击开始下载,就会将搜索结果的第一…

FoLR:Focus on Local Regions for Query-based Object Detection论文学习笔记

论文地址:https://arxiv.org/abs/2310.06470 自从DETR问询式检测器首次亮相以来,基于查询的方法在目标检测中引起了广泛关注。然而,这些方法面临着收敛速度慢和性能亚优等挑战。值得注意的是,在目标检测中,自注意力机制…

H5游戏源码分享-手机捉鬼游戏

H5游戏源码分享-手机捉鬼游戏 一款考验手速的游戏 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><title>手机捉鬼 微信HTML5在线朋友圈游戏</title><meta name&…

SSM度假村管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 度假村管理系统是一套完善的信息系统&#xff0c;结合SSM框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要 采用B/S模式开发…

计算机毕设 opencv 图像识别 指纹识别 - python

文章目录 0 前言1 课题背景2 效果展示3 具体实现3.1 图像对比过滤3.2 图像二值化3.3 图像侵蚀细化3.4 图像增强3.5 特征点检测 4 OpenCV5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往…

VulnHub DC-1

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

自动驾驶,从“宠儿”走进“淘汰赛”

从“一步到位”到场景、技术降维。从拼落地路径&#xff0c;到拼雷达、算力&#xff0c;再到如今的性价比之争&#xff0c;自动驾驶似乎变得愈发“接地气”。 作者|斗斗 编辑|皮爷 出品|产业家 比起去年&#xff0c;黄文欢和张放今年显得更加忙碌。 “自动驾驶赛道&…

“爱知道”,你知道吗?

拥抱时代浪潮&#xff0c;加速科技变革。数字经济时代&#xff0c;杭州重点贯彻市委市政府数字经济创新提质“一号发展工程”&#xff0c;加快发展数字经济&#xff0c;推动全市数字经济往高攀升、向新进军、以融提效。基于政府对数字经济新活力的赋能、优化数字社会环节、构建…

若依微服务上传图片文件代理配置

在使用若依微服务文件上传时候,文件上传成功会上传到D:/ruoyi/uploadPath目录下。默认使用9300端口进行访问图片文件,现在我想把它代理到80端口应该怎么做呢? 配置前:http://localhost:9300/statics/2023/09/24/test.jpg 配置后:http://localhost/statics/2023/09/24/test…

msigdbr hallmarks gsea broad研究所

使用msigdbr r包 #BiocManager::install("msigdb") #https://www.gsea-msigdb.org/gsea/msigdb #https://cran.r-project.org/web/packages/msigdbr/vignettes/msigdbr-intro.html #https://bioconductor.org/packages/release/data/experiment/vignettes/msigdb/ins…

LVS-DR模式+keepalived+nginx+tomcat实现动静分离、负载均衡、高可用实验

实验条件&#xff1a; test2——20.0.0.20——主服务器——ipvsadm、keepalived服务 test3——20.0.0.30——备服务器——ipvsadm、keepalived服务 nginx5——20.0.0.51——后端真实服务器1&#xff08;tomcat的代理服务器&#xff09;——nginx服务 nginx6——20.0.0.61—…

【笔录】TVP技术沙龙:寻宝AI时代

目录 引言大模型的应用案例大模型三问模型落地可行性考量维度AIGC的几个可行应用方向AIGC的存储LLM工程应用范式演进LLM编程协作范式变化 引言 大模型是10倍的机会&#xff0c;但并不是平均主义的机会&#xff0c;没有低垂的果实。 企业想在大模型的赛道上跑出成绩&#xff0c;…

Python第三方库 - Flask(python web框架)

1 Flask 1.1 认识Flask Web Application Framework&#xff08; Web 应用程序框架&#xff09;或简单的 Web Framework&#xff08; Web 框架&#xff09;表示一个库和模块的集合&#xff0c;使 Web 应用程序开发人员能够编写应用程序&#xff0c;而不必担心协议&#xff0c;线…

Go语言标准输入

文章目录 Go语言标准输入函数使用 Go语言标准输入 函数 Scan // 使用stdin读取内容&#xff0c;读取的内容以空白&#xff08;换行也属于空白&#xff09;分隔&#xff0c;赋值给函数参数。返回读取的个数和错误 func Scan(a ...interface{}) (n int, err error)Scanf // 和…

基于Qt实现的轻量级CAD画图软件

1.界面展示 2.功能展示 3.关于Graphics View绘图架构 由于QPainter画图形&#xff0c;不能实现对图形的选择、编辑、移动等操作&#xff0c;所以我的整个项目是基于Craphics View绘图架构来实现的 3.1 Craphics View &#xff08;1&#xff09;Craphics View绘图架构介绍 …

【计算机视觉】3D视觉

文章目录 一、基本问题二、三个坐标系 X w \boldsymbol{X}_w Xw​到 X c \boldsymbol{X}_c Xc​的转换 X c \boldsymbol{X}_c Xc​到 x i \boldsymbol{x}_i xi​的转换投影矩阵尺度模糊问题 三、相机标定四、立体视觉 我的《计算机视觉》系列参考UC Berkeley的CS180课程&#x…