#python #tensorflow #tensor #tensorly
#python #тензорный поток #тензор #тензорно
Вопрос:
Я очень новичок в tensor, а также в библиотеке tensorly.Я наткнулся на один из лучших примеров тензорной декомпозиции на jeankossaifi, но мне нужен пример тензорной функции non_negative_tucker() для тензорной декомпозиции, расширив пример по ссылке выше (для набора данных Olivetti).
Ответ №1:
Интерфейс практически такой же, как у robust_pca.
Давайте создадим случайный пример тензора X
,:
import tensorly as tl
import numpy as np
X = tl.tensor(np.random.random((10, 11, 12)))
Вы должны применить надежный тензорный PCA следующим образом:
from tensorly.decomposition import robust_pca
D, E = robust_pca(X)
Это дает вам тензор низкого ранга D
и разреженный E
, такой, что D E = X
(приблизительно).
Вместо этого неотрицательный Tucker вернет вам неотрицательное ядро и некоторые неотрицательные факторы. Обратите внимание, что теперь вам также нужно указать ранг для декомпозиции.
from tensorly.decomposition import non_negative_tucker
core, factors = non_negative_tucker(X, rank=(12, 12, 12), n_iter_max=1000)
Вы можете восстановить тензор, используя эти и проверить ошибку восстановления:
reconstruction = tl.tucker_to_tensor(core, factors)
error = tl.norm(reconstruction - X)/tl.norm(X)
Вы можете взглянуть на страницу API для этой функции.
Комментарии:
1.вот код:
core, tucker_factors,rec_errors, mode = non_negative_tucker(X, rank=tucker_rank, n_iter_max=100, init='random')
tucker_reconstruction = tl.tucker_to_tensor(core, tucker_factors)
visualise_images(tucker_reconstruction, 12, 4)
я не получаю правильного результата при отображении изображений.Я только что расширил пример jeankossaifi .2. Вы неправильно используете функцию:
non_negative_tucker
не возвращает ошибки восстановления или режим. Правильное использование — это то, которое я написал в сообщении, напримерcore, factors = non_negative_tucker(X, rank=(12, 12, 12), n_iter_max=1000)
.3. я соответствующим образом изменил код, который выглядит следующим образом:
data = fetch_olivetti_faces() X = data.images X = X.astype(np.float64) X -= X.mean() tucker_rank = [80, 80, 80] core, tucker_factors = non_negative_tucker(X, rank=tucker_rank, n_iter_max=100, init='random') tucker_reconstruction = tl.tucker_to_tensor(core, tucker_factors) visualise_images(tucker_reconstruction, 12, 4)
вывод по-прежнему представляет собой набор размытых изображений. Пожалуйста, исправьте, если в коде что-то не так.4. Чего вы пытаетесь достичь? Вам нужно, чтобы факторы и ядро были неотрицательными? Если нет, попробуйте Tucker (или partial_tucker, если вам не нужно разлагать по размеру выборки). Также изображения имеют размер 64×64, но вы выбрали ранг 80 для этих измерений, поэтому вы переопределяете параметры. Наконец, svd — гораздо лучшая инициализация, чем random . Итак, с помощью tucker вы могли бы попробовать
core, tucker_factors = tucker(X, rank=tucker_rank, n_iter_max=100, tol=10e-10, init='svd')
.5. Спасибо, он работает просто идеально. Благодаря библиотеке tensorly. Еще одна вещь, о которой вы упомянули функцию add_noise() в статье, но я не получаю эту функцию, даже если я обновил тензорно.