编写不易如果觉得不错,麻烦关注一下~
【1】参考连接https://blog.csdn.net/hopyGreat/article/details/86351972 【矩阵乘积】
【2】https://positive.blog.csdn.net/article/details/113744587?ivk_sa=1024320u【按元素乘积,直觉上卷积网络多通道的卷积操作。】
【3】https://blog.csdn.net/weixin_49883619/article/details/109902127【张量的运算】
【4】https://blog.csdn.net/weixin_49883619/article/details/109889177【张量的运算】
【5】https://zhuanlan.zhihu.com/p/24798389 【Turker 分解 CP分解】
>>> tensor_1
tensor([[[[1., 1., 1.],
[1., 1., 1.],
[3., 3., 3.],
[1., 1., 1.]],
[[1., 1., 1.],
[1., 1., 1.],
[3., 3., 3.],
[1., 1., 1.]],
[[1., 1., 1.],
[1., 1., 1.],
[3., 3., 3.],
[1., 1., 1.]]],
[[[1., 1., 1.],
[1., 1., 1.],
[3., 3., 3.],
[1., 1., 1.]],
[[1., 1., 1.],
[1., 1., 1.],
[3., 3., 3.],
[1., 1., 1.]],
[[1., 1., 1.],
[1., 1., 1.],
[3., 3., 3.],
[1., 1., 1.]]]])
>>> tensor
tensor([[[[1., 1., 1., 1.],
[2., 2., 2., 2.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[2., 2., 2., 2.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[2., 2., 2., 2.],
[1., 1., 1., 1.]]],
[[[1., 1., 1., 1.],
[2., 2., 2., 2.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[2., 2., 2., 2.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[2., 2., 2., 2.],
[1., 1., 1., 1.]]]])
>>> tensor.shape
torch.Size([2, 3, 3, 4])
>>> tensor_1.shape
torch.Size([2, 3, 4, 3])
>>> tensor.matmul(tensor_1)
tensor([[[[ 6., 6., 6.],
[12., 12., 12.],
[ 6., 6., 6.]],
[[ 6., 6., 6.],
[12., 12., 12.],
[ 6., 6., 6.]],
[[ 6., 6., 6.],
[12., 12., 12.],
[ 6., 6., 6.]]],
[[[ 6., 6., 6.],
[12., 12., 12.],
[ 6., 6., 6.]],
[[ 6., 6., 6.],
[12., 12., 12.],
[ 6., 6., 6.]],
[[ 6., 6., 6.],
[12., 12., 12.],
[ 6., 6., 6.]]]])
>>> g = tensor.matmul(tensor_1)
>>> g.shape
torch.Size([2, 3, 3, 3])
第三个链接中的张量的扩展~
知乎中的Turker 分解图
上面这张图其实会经常出现在论文里
链接4 已给出一个按照mode-1 unfolding 的解法,当然也可以按照mode-2,mode-3进行分解,但是需要记住最后恢复成张量形状时,维度需要调换一下(先把张量变成一个矩阵,然后与矩阵相乘,将结果按照之前的展开方式再还原回去。)
(按照mode-1将T 张量 进行展开成矩阵形式)
猜测一下最后一个链接的一个公式:应该就是按照上面的标记 X1代表是在mode-1 unfolding ( 记住mode1不动,mode2 是第二个维度与第一个维度换一下位置,mode3 是第三个位置与第一个位置换一下,这样才能恢复到原先刚分解时的张量的老亚子...
例如(1,2,3,4)不动,(2,1,3,4)第二个与第一个换....
公式是从左到右,计算是从右拨到左,而且每一个符号算完都得恢复成一个张量形状继续第二个符号。)
W V U G -> UG : n1×r1 乘 r1×(r2×r3) =》转换回张量维度:n1×r2×r3.
V U G : n2×r2 乘r2×(n1×r3)=》转换回张量维度:n1×n2×r3.
W V U G :n3×r3 乘r3×(n1×n2)=》转换回张量维度:n1×n2×n3
针对稀疏的张量,这样分解,可以节省空间。
另一个常见的CP张量分解的示意图:(Low-Rank Tensor Networks for Dimensionality Reduction and Large-Scale Optimization Problems: Perspectives and Challenges PART 1)