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:爱因斯坦求和约定
使用实例
矩阵乘法:
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]])
∑ b A w , i , b B w , j , b = C w , i , j 将 A 的 i 行 拿 出 来 , B 的 j 行 那 出 来 相 乘 相 加 , 放 到 C 的 i , j 位 置 上 \sum_b{A_{w,i,b}}{B_{w,j,b}}=C_{w,i,j}\\ 将A的i行拿出来,B的j行那出来相乘相加,放到C的i,j位置上 b∑Aw,i,bBw,j,b=Cw,i,j将A的i行拿出来,B的j行那出来相乘相加,放到C的i,j位置上
“奇怪”特性
data = torch.ones(9).a.view(-1, 9).cuda()
let = torch.randn(3, 3)
k=0
for i in range(let.shape[0]):
for j in range(i):
let[i, j] = -1 * data[0, k]
let[j, i] = data[0, k]
k = k + 1
能够相乘,不会报错:
Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu! (when checking argument for argument mat2 in method wrapper_mm)