python:pytorch维度变换,爱因斯坦求和约定enisum,einops

您所在的位置:网站首页 pytorch维度变挽物理意义 python:pytorch维度变换,爱因斯坦求和约定enisum,einops

python:pytorch维度变换,爱因斯坦求和约定enisum,einops

2023-09-18 02:07| 来源: 网络整理| 查看: 265

pytorch维度理解:

view or resize         维 度 是 按 照 括 号 的 逐 层 匹 配 深 入 的 。 \ \ \ \ \ \ \ 维度是按照括号的逐层匹配深入的。        维度是按照括号的逐层匹配深入的。 可通过这个例子看以下矩阵的行列所对应的索引:cat 可通过这个例子看以下矩阵的行列所对应的索引:normallize

import torch b = torch.randn((2,3)) print(b) a = torch.nn.functional.normalize(b,dim = 1) print(a) print(a[0,0]**2+a[0,1]**2+a[0,2]**2) print(a[0,0]**2+a[1,0]**2) # 结果 tensor([[-1.9235, 0.0256, -0.1232], [ 0.0669, 0.1589, 0.2435]]) tensor([[-0.9979, 0.0133, -0.0639], [ 0.2241, 0.5325, 0.8162]]) tensor(1.0000) dim=1 即括号内的元素,即每3个数字 tensor(1.0460)

pytorch中squeeze()和unsqueeze()函数

一个4维矩阵: X=torch.Size([6, 12, 18, 18]) 取(X[:, 0, :, :])=torch.Size([6, 18, 18]) 取(X[:, 0, :, :]).unsqueeze(-3)=torch.Size([1, 1, 18, 18])

view:但必须保证调整前后元素总数一致,a.view(2, 3) view()方法和resize()方法的区别:view不改变数据 还有一种einops方法(可跨框架)

矩阵乘法 x = torch.randn(1, 12, 3, 3) 与 y = torch.randn(3, 3) 相乘 x @ y = (108,3)@(3, 3) =>(1, 12, 3, 3) 2维矩阵与3维矩阵相乘 x =torch.tensor([[[1,2,3],[1,1,0]],[[1,1,0],[1,1,0]]]) # torch.Size([2, 2, 3]) y= torch.tensor([[1],[1],[0]]) #torch.Size([3, 1]) res= torch.matmul(x, y)# torch.Size([2, 2, 1]) tensor([[[3], [2]], [[2], [2]]])

矩阵乘法:torch.matmul()可以认为该乘法使用使用两个参数的后两个维度来计算,其他的维度都可以认为是batch维度。

enisum官方文档

einsum:einsum是一种能够简洁表示点积、外积、转置、矩阵-向量乘法、矩阵-矩阵乘法等运算的领域特定语言。 einsum:爱因斯坦求和约定

使用实例

c o v s = ∑ b A w , i , b B w , j , b = C w , i , j 将 A 的 i 行 拿 出 来 , B 的 j 行 那 出 来 相 乘 相 加 , 放 到 C 的 i , j 位 置 上 covs = \sum_b{A_{w,i,b}}{B_{w,j,b}}=C_{w,i,j}\\ 将A的i行拿出来,B的j行那出来相乘相加,放到C的i,j位置上 covs=b∑​Aw,i,b​Bw,j,b​=Cw,i,j​将A的i行拿出来,B的j行那出来相乘相加,放到C的i,j位置上

矩阵乘法: torch.einsum('ik,kj->ij',[a,b]) 批量矩阵乘法: torch.einsum('ijk,ikl->ijl',[a,b]) 外积: torch.einsum('i,j->ij',[a,b]) # 爱因斯坦求和约定 import torch a=torch.arange(6).reshape(2,3,1) covs = torch.einsum("wib,wjb->wij", a, a) means = torch.einsum("wib->wi", a) # 对最后一个维度数据求和,实验分别给出b=1和2的情况 print(a) print(covs) print(means) tensor([[[0], [1], [2]], [[3], [4], [5]]]) tensor([[[ 0, 0, 0], [ 0, 1, 2], [ 0, 2, 4]], [[ 9, 12, 15], [12, 16, 20], [15, 20, 25]]]) tensor([[0, 1, 2], [3, 4, 5]]) # a=torch.arange(12).reshape(2,3,2) tensor([[[ 0, 1], [ 2, 3], [ 4, 5]], [[ 6, 7], [ 8, 9], [10, 11]]]) tensor([[[ 1, 3, 5], [ 3, 13, 23], [ 5, 23, 41]], [[ 85, 111, 137], [111, 145, 179], [137, 179, 221]]]) tensor([[ 1, 5, 9], [13, 17, 21]]) x = torch.range(0,5) y = torch.range(0,4) res = torch.einsum('i,j->ij', x, y) tensor([[ 0., 0., 0., 0., 0.], [ 0., 1., 2., 3., 4.], [ 0., 2., 4., 6., 8.], [ 0., 3., 6., 9., 12.], [ 0., 4., 8., 12., 16.], [ 0., 5., 10., 15., 20.]]) einops 命令行:pip install einops 或:pip install einops -i https://pypi.tuna.tsinghua.edu.cn/simple

使用例子:

from einops import rearrange import torch a = torch.randn(3, 9, 9) # [3, 9, 9] output = rearrange(a, 'c (r p) w -> c r p w', p=3) print(output.shape) # [3, 3, 3, 9] from einops import repeat import torch cccccc = torch.randn(2, 2) # [2, 2] vvvvvv = repeat(cccccc, 'h w -> c h w', c=3) # [3, 2, 2]


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3