赞
踩
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
本文主要对张量的基于pytorch的基础操作以及张量的CP分解、Tucker分解的关键知识点总结。
torch.reshape()可以对张量的各个维度的大小进行变换,但总的维度大小需保存不变。
import torch
a = torch.arange(4.)
b = torch.arange(4.)
##用法一
a = torch.reshape(a, (2, 2))
print(a.shape)
print(a)
##用法二
b = b.reshape(2,2)
print(b.shape)
print(b)
对矩阵维度之间的交换。
torch.permute(input, dims) → Tensor
import torch
c=torch.arange(24)
c=c.reshape(2,3,4)
print('c:\n',c)
print('c.shape',c.shape)
d = torch.permute(c,(2,0,1)) #index 0和index 2交换
e = c.permute(2,0,1) #也可以这么用
print('d.shape',d.shape)
print('d\n',d)
print('e.shape',e.shape)
print('e\n',e)
输出结果如下:
这是张量计算非常强大非常重要的一个函数
torch.einsum(equation, *operands) → Tensor
->右边消失的维度即时沿着该维度累加,例如‘abc,cde->abe’
例如在神经网络中,我们想进行batch计算
可以参考b站课程【张量网络PyThon编程:1.4 张量网络图形表示】
实际上就是把张量变成矩阵。对于三维张量,有张量按模式展开成矩阵,假设原来张量维度(i,j,k)。
模一张开即为(i,j,k)->(i,jk)
模二展开即为(i,j,k)->(j,ik)
模三展开即为(i,j,k)->(k,ij)
可参考如何简单地理解和实现「张量展开」
我们可以借助torch.reshape()函数实现。
关于这部分的知识点来自于张量网络PyThon编程
将K阶张量分解为K个向量的直积。
T = ζ ∏ ⊗ k = 0 K − 1 v ( k ) \boldsymbol{T}=\zeta \prod_{\otimes k=0}^{K-1} \boldsymbol{v}^{(k)} T=ζ∏⊗k=0K−1v(k)
其中
ζ
\zeta
ζ是一个标量系数。
由于大多数张量不存在严格的单秩分解,于是便有了最优单秩近似问题。
min ζ , { ∣ v [ k ] ∣ = 1 } ∣ T − ζ ∏ ⊗ k = 0 K − 1 v ( k ) ∣ \min _{\zeta,\left\{\left|v^{[k]}\right|=1\right\}}\left|\boldsymbol{T}-\zeta \prod_{\otimes k=0}^{K-1} \boldsymbol{v}^{(k)}\right| minζ,{∣v[k]∣=1} T−ζ∏⊗k=0K−1v(k)
通过对张量进行单秩分解,我们可以达到对参数进行压缩的目的。
CP分解,是将张量分解为一系列秩一张量之和。
将单秩张量的形式稍作扩展,定义CP积,设N阶张量
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。