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)
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维度。
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,bBw,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.]])
命令行: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]