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

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=bAw,i,bBw,j,b=Cw,i,jAiBjCi,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]

你可能感兴趣的:(语言学习笔记,pytorch,python,矩阵)