Spec-Zone.ru › TensorFlow 2.3

tf.sparse.sparse_dense_matmul

Просмотреть исходный код на GitHub

Умножение разреженного тензора (или плотной матрицы) (ранга 2) "A" на плотную матрицу

Просмотр псевдонимов

Псевдонимы для миграции

См. Руководство по миграции для получения более подробной информации.

tf.compat.v1.sparse.matmul, tf.compat.v1.sparse.sparse_dense_matmul, tf.compat.v1.sparse_tensor_dense_matmul

tf.sparse.sparse_dense_matmul(
    sp_a, b, adjoint_a=False, adjoint_b=False, name=None
)

(или разреженный тензор) "B". Обратите внимание, что один и только один из входных данных ДОЛЖЕН быть разреженным тензором, а другой — плотной матрицей.

Проверка допустимости индексов A не выполняется. Однако для оптимального поведения рекомендуется следующий формат входных данных:

  • Если adjoint_a == false: A должны быть отсортированы в лексикографически возрастающем порядке. Используйте sparse.reorder, если вы не уверены.
  • Если adjoint_a == true: A должны быть отсортированы в порядке возрастания измерения 1 (т. е. в порядке "столбец-главный", а не "строка-главный").

Использование tf.nn.embedding_lookup_sparse для разреженного умножения:

Хотя это не очевидно, вы можете рассматривать embedding_lookup_sparse как ещё один пример разреженного и плотного умножения. В некоторых ситуациях вы можете предпочесть использовать embedding_lookup_sparse даже если вы не работаете с эмбеддингами.

При принятии решения необходимо задать два вопроса: требуется ли вычисление градиентов как разреженных? Представлены ли ваши разреженные данные двумя SparseTensor: id и значения? Более подробное объяснение формата данных приведено ниже. Если ответ на любой из этих вопросов — да, рассмотрите возможность использования tf.nn.embedding_lookup_sparse.

Ниже объясняются различия в ожидаемых разреженных тензорах: например, если плотная форма ваших разреженных данных имеет форму [3, 5] и значения:

[[  a      ]
 [b       c]
 [    d    ]]

SparseTensor формат, ожидаемый sparse_tensor_dense_matmul: sp_a (индексы, значения):

[0, 1]: a
[1, 0]: b
[1, 4]: c
[2, 2]: d

SparseTensor формат, ожидаемый embedding_lookup_sparse: sp_ids sp_weights

[0, 0]: 1                [0, 0]: a
[1, 0]: 0                [1, 0]: b
[1, 1]: 4                [1, 1]: c
[2, 0]: 2                [2, 0]: d

Решение о том, когда использовать sparse_tensor_dense_matmul по сравнению с matmul(a_is_sparse=True):

При принятии решения необходимо задать ряд вопросов, включая:

  • Разреженный тензор A поместится в памяти при преобразовании в плотную форму?
  • Количество столбцов произведения велико (>> 1)?
  • Плотность A больше, чем примерно 15%?

Если ответ на несколько из этих вопросов — да, рассмотрите возможность преобразования SparseTensor в плотную форму и использования tf.matmul с a_is_sparse=True.

Данная операция, как правило, работает хорошо, когда A более разрежен, если размерность столбцов произведения невелика (например, умножение матрицы на вектор), если sp_a.dense_shape принимает большие значения.

Ниже приводится приблизительное сравнение производительности sparse_tensor_dense_matmul, помеченное 'разреженный', и matmul(a_is_sparse=True), помеченное 'плотный'. Для целей сравнения время, затрачиваемое на преобразование из SparseTensor в плотную Tensor форму, не включено, поэтому соотношение времени является чрезмерно консервативным.

Система для тестирования производительности:

Процессор: Intel Ivybridge с HyperThreading (6 ядер) dL1:32 КБ dL2:256 КБ dL3:12 МБ Видеокарта: NVidia Tesla k40c

Скомпилировано с:

-c opt --config=cuda --copt=-mavx

tensorflow/python/sparse_tensor_dense_matmul_op_test --benchmarks
A sparse [m, k] with % nonzero values between 1% and 80%
B dense [k, n]

% nnz  n   gpu   m     k     dt(dense)     dt(sparse)   dt(sparse)/dt(dense)
0.01   1   True  100   100   0.000221166   0.00010154   0.459112
0.01   1   True  100   1000  0.00033858    0.000109275  0.322745
0.01   1   True  1000  100   0.000310557   9.85661e-05  0.317385
0.01   1   True  1000  1000  0.0008721     0.000100875  0.115669
0.01   1   False 100   100   0.000208085   0.000107603  0.51711
0.01   1   False 100   1000  0.000327112   9.51118e-05  0.290762
0.01   1   False 1000  100   0.000308222   0.00010345   0.335635
0.01   1   False 1000  1000  0.000865721   0.000101397  0.117124
0.01   10  True  100   100   0.000218522   0.000105537  0.482958
0.01   10  True  100   1000  0.000340882   0.000111641  0.327506
0.01   10  True  1000  100   0.000315472   0.000117376  0.372064
0.01   10  True  1000  1000  0.000905493   0.000123263  0.136128
0.01   10  False 100   100   0.000221529   9.82571e-05  0.44354
0.01   10  False 100   1000  0.000330552   0.000112615  0.340687
0.01   10  False 1000  100   0.000341277   0.000114097  0.334324
0.01   10  False 1000  1000  0.000819944   0.000120982  0.147549
0.01   25  True  100   100   0.000207806   0.000105977  0.509981
0.01   25  True  100   1000  0.000322879   0.00012921   0.400181
0.01   25  True  1000  100   0.00038262    0.00014158   0.370035
0.01   25  True  1000  1000  0.000865438   0.000202083  0.233504
0.01   25  False 100   100   0.000209401   0.000104696  0.499979
0.01   25  False 100   1000  0.000321161   0.000130737  0.407076
0.01   25  False 1000  100   0.000377012   0.000136801  0.362856
0.01   25  False 1000  1000  0.000861125   0.00020272   0.235413
0.2    1   True  100   100   0.000206952   9.69219e-05  0.46833
0.2    1   True  100   1000  0.000348674   0.000147475  0.422959
0.2    1   True  1000  100   0.000336908   0.00010122   0.300439
0.2    1   True  1000  1000  0.001022      0.000203274  0.198898
0.2    1   False 100   100   0.000207532   9.5412e-05   0.459746
0.2    1   False 100   1000  0.000356127   0.000146824  0.41228
0.2    1   False 1000  100   0.000322664   0.000100918  0.312764
0.2    1   False 1000  1000  0.000998987   0.000203442  0.203648
0.2    10  True  100   100   0.000211692   0.000109903  0.519165
0.2    10  True  100   1000  0.000372819   0.000164321  0.440753
0.2    10  True  1000  100   0.000338651   0.000144806  0.427596
0.2    10  True  1000  1000  0.00108312    0.000758876  0.70064
0.2    10  False 100   100   0.000215727   0.000110502  0.512231
0.2    10  False 100   1000  0.000375419   0.0001613    0.429653
0.2    10  False 1000  100   0.000336999   0.000145628  0.432132
0.2    10  False 1000  1000  0.00110502    0.000762043  0.689618
0.2    25  True  100   100   0.000218705   0.000129913  0.594009
0.2    25  True  100   1000  0.000394794   0.00029428   0.745402
0.2    25  True  1000  100   0.000404483   0.0002693    0.665788
0.2    25  True  1000  1000  0.0012002     0.00194494   1.62052
0.2    25  False 100   100   0.000221494   0.0001306    0.589632
0.2    25  False 100   1000  0.000396436   0.000297204  0.74969
0.2    25  False 1000  100   0.000409346   0.000270068  0.659754
0.2    25  False 1000  1000  0.00121051    0.00193737   1.60046
0.5    1   True  100   100   0.000214981   9.82111e-05  0.456836
0.5    1   True  100   1000  0.000415328   0.000223073  0.537101
0.5    1   True  1000  100   0.000358324   0.00011269   0.314492
0.5    1   True  1000  1000  0.00137612    0.000437401  0.317851
0.5    1   False 100   100   0.000224196   0.000101423  0.452386
0.5    1   False 100   1000  0.000400987   0.000223286  0.556841
0.5    1   False 1000  100   0.000368825   0.00011224   0.304318
0.5    1   False 1000  1000  0.00136036    0.000429369  0.31563
0.5    10  True  100   100   0.000222125   0.000112308  0.505608
0.5    10  True  100   1000  0.000461088   0.00032357   0.701753
0.5    10  True  1000  100   0.000394624   0.000225497  0.571422
0.5    10  True  1000  1000  0.00158027    0.00190898   1.20801
0.5    10  False 100   100   0.000232083   0.000114978  0.495418
0.5    10  False 100   1000  0.000454574   0.000324632  0.714146
0.5    10  False 1000  100   0.000379097   0.000227768  0.600817
0.5    10  False 1000  1000  0.00160292    0.00190168   1.18638
0.5    25  True  100   100   0.00023429    0.000151703  0.647501
0.5    25  True  100   1000  0.000497462   0.000598873  1.20386
0.5    25  True  1000  100   0.000460778   0.000557038  1.20891
0.5    25  True  1000  1000  0.00170036    0.00467336   2.74845
0.5    25  False 100   100   0.000228981   0.000155334  0.678371
0.5    25  False 100   1000  0.000496139   0.000620789  1.25124
0.5    25  False 1000  100   0.00045473    0.000551528  1.21287
0.5    25  False 1000  1000  0.00171793    0.00467152   2.71927
0.8    1   True  100   100   0.000222037   0.000105301  0.47425
0.8    1   True  100   1000  0.000410804   0.000329327  0.801664
0.8    1   True  1000  100   0.000349735   0.000131225  0.375212
0.8    1   True  1000  1000  0.00139219    0.000677065  0.48633
0.8    1   False 100   100   0.000214079   0.000107486  0.502085
0.8    1   False 100   1000  0.000413746   0.000323244  0.781261
0.8    1   False 1000  100   0.000348983   0.000131983  0.378193
0.8    1   False 1000  1000  0.00136296    0.000685325  0.50282
0.8    10  True  100   100   0.000229159   0.00011825   0.516017
0.8    10  True  100   1000  0.000498845   0.000532618  1.0677
0.8    10  True  1000  100   0.000383126   0.00029935   0.781336
0.8    10  True  1000  1000  0.00162866    0.00307312   1.88689
0.8    10  False 100   100   0.000230783   0.000124958  0.541452
0.8    10  False 100   1000  0.000493393   0.000550654  1.11606
0.8    10  False 1000  100   0.000377167   0.000298581  0.791642
0.8    10  False 1000  1000  0.00165795    0.00305103   1.84024
0.8    25  True  100   100   0.000233496   0.000175241  0.75051
0.8    25  True  100   1000  0.00055654    0.00102658   1.84458
0.8    25  True  1000  100   0.000463814   0.000783267  1.68875
0.8    25  True  1000  1000  0.00186905    0.00755344   4.04132
0.8    25  False 100   100   0.000240243   0.000175047  0.728625
0.8    25  False 100   1000  0.000578102   0.00104499   1.80763
0.8    25  False 1000  100   0.000485113   0.000776849  1.60138
0.8    25  False 1000  1000  0.00211448    0.00752736   3.55992
Аргументы
sp_a Разреженный тензор (или плотная матрица) A, ранга 2.
b Плотная матрица (или разреженный тензор) B с тем же типом данных, что и sp_a.
adjoint_a Использовать сопряжённую транспонированную матрицу A в матричном умножении. Если A комплексная, это transpose(conj(A)). В противном случае это transpose(A).
adjoint_b Использовать сопряжённую транспонированную матрицу B в матричном умножении. Если B комплексная, это transpose(conj(B)). В противном случае это transpose(B).
name Префикс имени для возвращаемых тензоров (необязательно)
Возвращаемое значение
Плотная матрица (псевдокод в плотной записи np.matrix): A = A.H if adjoint_a else A B = B.H if adjoint_b else B return A*B

© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.3/api_docs/python/tf/sparse/sparse_dense_matmul

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API