torch.einsum() 用法说明

这篇具有很好参考价值的文章主要介绍了torch.einsum() 用法说明。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关联网站:
einops官网


torch.einsum( equation , * operands ) → Tensor

对输入元素operands沿指定的维度、使用爱因斯坦求和符号的乘积求和。

参数:

  • equation ( string ) – 爱因斯坦求和的下标。

  • operandsList [ Tensor ])——计算爱因斯坦求和的张量。

​ Einsum允许计算许多常见的多维线性代数数组运算,方法是根据由equation给出的爱因斯坦求和约定,以速记(short-hand)格式表示它们。这种格式的细节在下面描述,但通常想法是operands 用一些下标标记输入的每个维度,并定义哪些下标是输出的一部分,operands然后通过对下标不属于输出维度的元素的乘积求和来计算输出。例如,矩阵乘法可以使用einsum计算为torch.einsum(“ij,jk->ik”, A, B)。这里,j 是求和下标,i 和 k 是输出下标(有关原因的更多详细信息,请参见下面的部分)。

equation 参数说明:

equation字符串以与维度相同的顺序指定输入的每个维度的下标( [a-z,A-Z] operands中的字母) ,用逗号 (‘,’) 分隔每个操作数的下标,例如’ij,jk’指定两个二维操作数的下标。标有相同下标的维度必须是可广播的,即它们的大小必须匹配或为1。例外情况是,如果对相同的输入操作数重复下标,在这种情况下,此操作数的标有此下标的维度必须在大小上匹配,并且操作数将被其沿这些维度的对角线替换。equation中只出现一次的下标将是输出的一部分,按字母顺序递增排序。输出是通过按元素乘以输入来计算的operands,它们的维度根据下标对齐,然后对下标不属于输出的维度求和。

​ 或者,可以通过在等式末尾添加箭头 (->) 后跟输出下标来显式定义输出下标。例如,以下等式计算矩阵乘法的转置:‘ij,jk->ki’。对于某些输入操作数,输出下标必须至少出现一次,而对于输出则最多出现一次。

​ 可以使用省略号 (...) 代替下标来广播省略号所涵盖的维度每个输入操作数最多可以包含一个省略号,它将覆盖下标未覆盖的维度,例如,对于具有 5 维的输入操作数,等式“ab…c”中的省略号覆盖第三和第四维。省略号不需要覆盖operands中相同数量的维度,但省略号的“形状”(它们覆盖的维度的大小)必须一起传播。如果未使用箭头 (->) 表示法显式定义输出,则省略号将首先出现在输出(最左侧的维度)中,位于输入操作数仅出现一次的下标标签之前。例如下面的等式实现批量矩阵乘法’…ij,…jk’。

​ 最后几点注意事项:equation可能在不同元素(下标、省略号、箭头和逗号)之间包含空格,但类似“…”的内容无效。空字符串 ’ ’ 对标量operands有效。

注:

  1. torch.einsum处理省略号 (‘…’) 的方式与 NumPy 不同,因为它允许对省略号覆盖的维度求和,也就是说,省略号不需要是输出的一部分。
  2. 此函数不会优化给定的表达式,因此用于相同计算的不同公式可能会运行得更快或消耗更少的内存。像 opt_einsum ( https://optimized-einsum.readthedocs.io/en/stable/
    )这样的项目可以为你优化公式。
  3. 从 PyTorch 1.10 开始,还支持子列表格式(请参见下面的示例)。在这种格式中,每个操作数的下标由子列表指定,子列表是 [0, 52) 范围内的整数列表。这些子列表跟在它们的操作数之后,一个额外的子列表可以出现在输入的末尾以指定输出的下标。例如torch。einsum
    (op1, sublist1, op2, sublist2, …, [subslist_out])。可以在子列表中提供Python
    的Ellipsis对象,以启用广播,如上面的方程式部分所述。torch.einsum()

例:文章来源地址https://www.toymoban.com/news/detail-611715.html

# trace(迹)
>>> torch.einsum('ii', torch.randn(4, 4))
tensor(-1.4157)


# diagonal(对角线)
>>> torch.einsum('ii->i', torch.randn(4, 4))
tensor([ 0.0266,  2.4750, -1.0881, -1.3075])


# outer product(外积)
>>> x = torch.randn(5)
tensor([-0.3550, -0.6059, -1.3375, -1.5649,  0.2675])
>>> y = torch.randn(4)
tensor([-0.2202, -1.5290, -2.0062,  0.9600])
>>> torch.einsum('i,j->ij', x, y)
tensor([[ 0.0782,  0.5428,  0.7122, -0.3408],
        [ 0.1334,  0.9264,  1.2156, -0.5817],
        [ 0.2945,  2.0451,  2.6834, -1.2840],
        [ 0.3445,  2.3927,  3.1396, -1.5023],
        [-0.0589, -0.4089, -0.5366,  0.2568]])


# batch matrix multiplication(批量矩阵乘法)
>>> As = torch.randn(3,2,5)
tensor([[[-0.0306,  0.8251,  0.0157, -0.4563,  0.5550],
         [-1.4550,  0.0762,  0.9258,  0.1198, -1.1737]],

        [[-0.4460, -0.7224,  0.7260,  0.7552,  0.0326],
         [-0.3904, -1.2392,  0.4848, -0.4756,  0.2301]],

        [[ 1.5307,  0.7668, -1.9426,  1.7473, -0.6258],
         [ 0.6758,  1.8240, -0.2053,  0.0973, -0.6118]]])

>>> Bs = torch.randn(3,5,4)
tensor([[[-0.7054, -0.2155, -1.5458, -0.8236],
         [-1.4957, -2.2604,  0.6897, -1.0360],
         [ 1.2924,  0.2798,  1.0544,  0.3656],
         [-0.3993, -1.2463, -0.6601,  0.2706],
         [ 1.0727,  0.5418, -0.2516, -0.1133]],

        [[ 0.4215,  1.5712, -0.2351,  1.3741],
         [ 1.6418,  0.9806, -1.0259, -1.1297],
         [ 0.7326,  0.4989,  0.4404,  0.2975],
         [-0.6866,  0.5696, -0.8942,  0.6815],
         [ 1.7486,  0.5344,  0.0538,  0.5258]],

        [[ 1.6280, -1.3989, -0.2900,  0.0936],
         [-0.9436, -0.1766,  0.6780,  0.3152],
         [ 0.9645, -0.1199, -1.1644, -1.0290],
         [-0.2791, -0.8086,  0.2161,  0.7901],
         [ 1.3222, -1.4023, -2.4181, -1.2875]]])

>>> torch.einsum('bij,bjk->bik', As, Bs)
tensor([[[-0.4147, -0.9847,  0.7946, -1.0103],
         [ 0.8020, -0.3849,  3.4942,  1.6233]],
        
        [[-1.3035, -0.5993,  0.4922,  0.9511],
         [-1.1150, -1.7346,  2.0142,  0.8047]],
        
        [[-1.4202, -2.5790,  4.2288,  4.5702],
         [-1.6549, -0.4636,  2.7802,  1.7141]]])


# with sublist format and ellipsis(带有子列表格式和省略号)
>>> torch.einsum(As, [..., 0, 1], Bs, [..., 1, 2], [..., 0, 2])
tensor([[[-0.4147, -0.9847,  0.7946, -1.0103],
         [ 0.8020, -0.3849,  3.4942,  1.6233]],
        
        [[-1.3035, -0.5993,  0.4922,  0.9511],
         [-1.1150, -1.7346,  2.0142,  0.8047]],
        
        [[-1.4202, -2.5790,  4.2288,  4.5702],
         [-1.6549, -0.4636,  2.7802,  1.7141]]])


# batch permute(批量交换)
>>> A = torch.randn(2, 3, 4, 5)
>>> torch.einsum('...ij->...ji', A).shape
torch.Size([2, 3, 5, 4])


# equivalent to torch.nn.functional.bilinear(等价于torch.nn.functional.bilinear)
>>> A = torch.randn(3,5,4)
>>> l = torch.randn(2,5)
>>> r = torch.randn(2,4)
>>> torch.einsum('bn,anm,bm->ba', l, A, r)
tensor([[-0.3430, -5.2405,  0.4494],
        [ 0.3311,  5.5201, -3.0356]])

到了这里,关于torch.einsum() 用法说明的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python深度学习【transforms所有用法介绍】

    裁剪——Crop 中心裁剪:transforms.CenterCrop 随机裁剪:transforms.RandomCrop 随机长宽比裁剪:transforms.RandomResizedCrop 上下左右中心裁剪:transforms.FiveCrop 上下左右中心裁剪后翻转,transforms.TenCrop 翻转和旋转——Flip and Rotation 依概率p水平翻转:transforms.RandomHorizontalFlip(p=0.5) 依概率p垂

    2024年02月03日
    浏览(48)
  • 【深度学习】torch.utils.data.DataLoader相关用法 | dataloader数据加载器 | pytorch

    dataloader数据加载器属于是深度学习里面非常基础的一个概念了,基本所有的图像项目都会用上,这篇博客就把它的相关用法总结一下。 之所以要写这篇,是想分清楚len(data_loader)和len(data_loader.dataset) 这里加载的数据我们以Mnist手写数据集为例子 torchvision.datasets.MNIST是用来加载

    2024年02月16日
    浏览(58)
  • 【深度学习笔记】彻底理解torch中的tensor与numpy中array区别及用法

    刚接触深度学习的同学,很多开源项目代码中, 张量tensor 与 数组array 都有使用,不清楚两者有什么区别,以及怎么使用,如何相互转换等。博主起初也有类似的疑惑,经过查阅资料以及实践,逐渐有了深入了解,本文将记录并分享自己对两者的理解,可供参考。 提示:以下

    2023年04月08日
    浏览(97)
  • Python到机器学习再到深度学习:一条完整的人工智能学习之路

    简短介绍Python在数据科学和机器学习领域的重要性。 概述本文的目标:提供一个清晰的学习路径,帮助初学者从Python基础学起,逐步过渡到机器学习和深度学习。 学习资源 :推荐一些学习Python的好书籍和在线课程。 书籍 :《Python Crash Course》Eric Matthes,适合初学者。 在线课

    2024年02月03日
    浏览(86)
  • 89 | Python人工智能篇 —— 深度学习算法 Keras 实现 MNIST分类

    本教程将带您深入探索Keras,一个开源的深度学习框架,用于构建人工神经网络模型。我们将一步步引导您掌握Keras的核心概念和基本用法,学习如何构建和训练深度学习模型,以及如何将其应用于实际问题中。

    2024年02月13日
    浏览(59)
  • 鱼类识别Python+深度学习人工智能+TensorFlow+卷积神经网络算法

    鱼类识别系统。使用Python作为主要编程语言开发,通过收集常见的30种鱼类(‘墨鱼’, ‘多宝鱼’, ‘带鱼’, ‘石斑鱼’, ‘秋刀鱼’, ‘章鱼’, ‘红鱼’, ‘罗非鱼’, ‘胖头鱼’, ‘草鱼’, ‘银鱼’, ‘青鱼’, ‘马头鱼’, ‘鱿鱼’, ‘鲇鱼’, ‘鲈鱼’, ‘鲍鱼’, ‘鲑

    2024年02月02日
    浏览(100)
  • 基于深度学习的乳腺癌智能检测分割与诊断系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标分割、人工智能

    《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌ 更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍 感谢小伙伴们点赞、关注! 《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】

    2024年04月13日
    浏览(79)
  • 90 | Python人工智能篇 —— 深度学习算法 Keras基于卷积神经网络的情感分类

    情感分类是自然语言处理(NLP)领域的一个重要任务,它旨在将文本划分为积极、消极或中性等不同情感类别。深度学习技术,尤其是卷积神经网络(CNN),在情感分类任务中取得了显著的成果。Keras作为一个高级的深度学习框架,提供了便捷易用的工具来构建和训练情感分

    2024年02月13日
    浏览(54)
  • pytorch中torch.roll用法说明

    torch.roll(input, shifts, dims=None)  这个函数是用来移位的,是顺移。input是咱们要移动的tensor向量,shifts是要移动到的位置,要移动去哪儿,dims是值在什么方向上(维度)去移动。比如2维的数据,那就两个方向,横着或者竖着。最关键的一句话,所有操作针对的是 第一行或者第一列

    2024年04月24日
    浏览(27)
  • 毕业设计-基于深度学习玉米叶病虫害识别系统 YOLO python 机器学习 目标检测 人工智能 算法

    目录 前言 设计思路 一、课题背景与意义 二、算法理论原理 2.1 卷积神经网络 2.2 YOLOv5算法 三、检测的实现 3.1 数据集 3.2 实验环境搭建 3.3 实验及结果分析 实现效果图样例 最后        📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准

    2024年02月03日
    浏览(136)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包