Spec-Zone.ru › TensorFlow 2.9

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". Обратите внимание, что один и только один из входов ДОЛЖЕН быть разреженным тензором, а другой — плотной матрицей.

Рекомендуется (но не обязательно) следующий формат входных данных для оптимальной производительности:

  • Если adjoint_a == false: A должны быть отсортированы в лексикографически возрастающем порядке. Используйте sparse.reorder, если вы не уверены.
  • Если adjoint_a == true: A должны быть отсортированы в порядке возрастания измерения 1 (т.е., в порядке "столбцы вперед", а не "строки вперед").
Аргументы
sp_a Разреженный тензор (или плотная матрица) A, ранга 2.
b Плотная матрица (или разреженный тензор) B, с тем же типом данных, что и sp_a.
adjoint_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

Примечания:

Использование 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, обозначенного 'sparse', и matmul(a_is_sparse=True), обозначенного 'dense'. В целях сравнения время, затраченное на преобразование из разреженного 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

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

Spec-Zone.ru

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