首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从tensorly为partial_tucker函数设计测试?

如何从tensorly为partial_tucker函数设计测试?
EN

Stack Overflow用户
提问于 2020-04-04 19:58:03
回答 1查看 144关注 0票数 2

我尝试设计一个测试,以验证tensorly的partial_tucker函数是否按我期望的那样工作。换句话说,我希望为partial_tucker函数设计一个输入及其相关的预期输出。

所以,我尝试做的是取一个初始随机张量A (阶数为4),手工计算它的“低阶”塔克分解,然后重建与初始张量相同形状的张量,比如A_tilde。我认为A_tilde张量就是初始张量A的“低阶近似”。我说的对吗?

然后我想在该A_tilde张量上使用partial_tucker函数,我希望结果与我手工计算的塔克分解相同。事实并非如此,所以我猜我手工制作的tucker分解是错误的。如果有,原因何在?

代码语言:javascript
复制
import tensorly
import numpy as np

h, w, c, f = 3, 3, 64, 128
c_prim, f_prim = 16, 32
base_tensor = np.random.rand(h, w, c, f)


# compute tucker decomposition by hand using higher order svd describred here: https://www.alexejgossmann.com/tensor_decomposition_tucker/.
lst_fac = []
for k in [2, 3]:
    mod_k_unfold = tensorly.base.unfold(base_tensor, k)
    U, _, _ = np.linalg.svd(mod_k_unfold)
    lst_fac.append(U)

real_in_fac, real_out_fac = lst_fac[0], lst_fac[1]
real_core = multi_mode_dot(base_tensor, [real_in_fac.T, real_out_fac.T], modes=(2,3))
del base_tensor  # no need of it anymore

# what i call the "low rank tucker decomposition"
real_core = real_core[:,:,:c_prim,:f_prim]
real_in_fac = real_in_fac[:, :c_prim]
real_out_fac = real_out_fac[:, :f_prim]

# low rank approximation
base_tensor_low_rank = multi_mode_dot(real_core, [real_in_fac, real_out_fac], modes=(2,3))
in_rank, out_rank = c_prim, f_prim
core_tilde, (in_fac_tilde, out_fac_tilde) = partial_tucker(base_tensor_low_rank, modes=(2, 3), ranks=(in_rank, out_rank), init='svd')
base_tensor_tilde = multi_mode_dot(core_tilde, [in_fac_tilde, out_fac_tilde], modes=(2,3))
assert np.allclose(base_tensor_tilde, base_tensor_low_rank) # this is OK

assert np.allclose(in_fac_tilde, real_in_fac) # this fails

请注意,我曾尝试计算in_fac_tilde.T @ real_in_fac以查看它是恒等式还是类似的东西,并且我注意到只有第一列在两个矩阵中是共线的,并且与所有其他矩阵正交。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-23 22:05:50

你在这里隐含地做了很多假设:例如,你假设你只需要修剪一个rank-R分解就可以得到rank-(R-1)分解。这通常不是真的。另外,请注意,您使用的Tucker分解不仅仅是高阶SVD (HO-SVD)。相反,HO-SVD用于初始化,随后是高阶正交迭代(HOOI)。

您还假设对于任何给定的排名,低排名分解都是唯一的,这将允许您直接比较分解的因子。这也不是这种情况(即使在矩阵的情况下,如果有很强的约束,比如正交性,你仍然会有符号不确定性)。

相反,例如,您可以检查相对重建错误。我建议您看看TensorLy中的tests。如果你从张量开始,在这方面有很多很好的参考。例如,科尔达和巴德的开创性工作;特别是塔克,德·拉索威尔等人的工作(例如on best low-rank approximation of tensors)等。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61027712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档