Что такое ранговый список в разложении Такера?

Я собираюсь разложить 4D-тензор, используя разложение Такера в python. Я нашел библиотеку, tensorly , чтобы сделать это. Я хочу выполнить разложение только по первому и второму измерениям. Чтобы выполнить декомпозицию tucker в некоторых режимах (не во всех режимах) с использованием тензора, мне нужно использовать команду partial_tucker . Это мой код:

      F = 256
D = 96
h = 5
w = 6
ranks = [89, 48] 
modes = [0, 1]

tensor = tl.tensor((np.arange(F*D*h*w).reshape((F, D, h, w))).astype(np.float64))
core, factors = partial_tucker(tensor, modes=modes, rank=ranks)

Этот код работает хорошо, но когда я пытаюсь изменить список рангов, например:

      ranks = [3,4]

Я получаю сообщение об ошибке следующим образом:

      Traceback (most recent call last):
  File "D:\PhD_Thessaloniki\Codes\LRF_Convolutional\tucker-decomposition.py", line 49, in <module>
    core, factors = partial_tucker(tensor, modes=modes, rank=ranks)
  File "C:\Users\Milad\Anaconda3\envs\tensorly\lib\site-packages\tensorly\decomposition\_tucker.py", line 109, in partial_tucker
    eigenvecs, _, _ = svd_fun(unfold(core_approximation, mode), n_eigenvecs=rank[index], random_state=random_state)
  File "C:\Users\Milad\Anaconda3\envs\tensorly\lib\site-packages\tensorly\backend\core.py", line 913, in partial_svd
    S, V = scipy.sparse.linalg.eigsh(
  File "C:\Users\Milad\Anaconda3\envs\tensorly\lib\site-packages\scipy\sparse\linalg\_eigen\arpack\arpack.py", line 1689, in eigsh
    params.iterate()
  File "C:\Users\Milad\Anaconda3\envs\tensorly\lib\site-packages\scipy\sparse\linalg\_eigen\arpack\arpack.py", line 571, in iterate
    raise ArpackError(self.info, infodict=self.iterate_infodict)
scipy.sparse.linalg._eigen.arpack.arpack.ArpackError: ARPACK error 3: No shifts could be applied during a cycle of the Implicitly restarted Arnoldi iteration. One possibility is to increase the size of NCV relative to NEV. 

Я не знаю, есть ли ограничение для определения ранга в разложении Такера или нет, но когда я пытаюсь выполнить разложение только по одному измерению, например:

      ranks = [3]
modes = [0]

или

      ranks = [4]
modes = [1]

снова хорошо работает.

Я хочу знать:

Это алгоритмическая или кодовая (тензорная) проблема (ограничение)?

Что это за проблема?

Какие ранговые списки действительны?

Спасибо

1 ответ

Такер полагается на PCA более высокого порядка. Ошибка, которую вы видите, заключается в разреженном SVD, примененном к развертыванию основного тензора.

Вы можете попробовать другую функцию SVD (svdпараметр в partial_tucker), вы можете увидеть доступную опцию, используяtensorly.tenalg.svd.SVD_FUNS.

Вы также можете попробовать тензор со случайными элементами, используяtensorly.random.random_tensorилиtensorly.randn.

Другие вопросы по тегам