Nano Hash - криптовалюты, майнинг, программирование

Масштабирование столбцов разреженного тензора вектором в тензорном потоке

Предположим, что A - разреженный двумерный двоичный тензор (NxN), а B - вектор (1xN). Я хочу масштабировать столбцы A на B: A_{i, j} <- A_{i, j} x B_{j} Я ищу эффективный способ сделать это. В настоящее время я пробовал два метода, но они слишком медленные:

  1. Преобразуйте B в диагональную матрицу BD и используйте tf.sparse_tensor_dense_matmul(A, BD). Это вернет плотную матрицу, и в результате метод неэффективен.
  2. Использование map_fn для разреженных тензоров tf.SparseTensor(A.indices, tf.map_fn(func, (A.values, A.indices[:, 1]), dtype=tf.float32), A.dense_shape). Это возвращает разреженный тензор, но кажется, что одна из функций map_fn или SparseTensor является узким местом.

Спасибо!


  • Я не уверен, как вы пишете свой func (есть несколько способов сделать это), поэтому я не сравнивал его в своем ответе. 30.04.2021

Ответы:


1

Более быстрое решение, вероятно, состоит в том, чтобы вызвать gather в вашем тензоре B, чтобы иметь возможность напрямую умножать значения A. Другой вариант - использовать tf.sparse.map_values, создав вектор обновлений с помощью tf.gather.

На 99% пустой разреженной матрице размера 1000x1000:

>>> %timeit tf.sparse.SparseTensor(A.indices, A.values*tf.gather(B,A.indices[:,1]), A.dense_shape)
855 µs ± 86 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Подход map_values:

>>> %timeit tf.sparse.map_values(tf.multiply, A, tf.gather(B,A.indices[:,1]))
978 µs ± 73 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

По сравнению с подходом sparse_dense_matmul:

>>> %timeit tf.sparse.from_dense(tf.sparse.sparse_dense_matmul(A,tf.linalg.diag(B)))
26.7 ms ± 2.24 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
30.04.2021
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..