tf.sparse.sparse_dense_matmul
| Просмотреть исходный код на GitHub |
Умножение разреженного тензора (ранга 2) "A" на плотную матрицу "B".
tf.sparse.sparse_dense_matmul(
sp_a, b, adjoint_a=False, adjoint_b=False, name=None
)
Проверка корректности индексов A не выполняется. Однако для оптимальной работы рекомендуется следующий формат входных данных:
- Если
adjoint_a == false:Aдолжны быть отсортированы в лексикографическом порядке возрастания. Используйтеsparse.reorder, если вы не уверены. - Если
adjoint_a == true:Aдолжны быть отсортированы по возрастанию измерения 1 (т. е., в порядке "столбцового" порядка вместо "строчного").
Использование tf.nn.embedding_lookup_sparse для разреженного умножения:
Хотя это не очевидно, можно рассматривать embedding_lookup_sparse как еще один вариант разреженного и плотного умножения. В некоторых ситуациях может быть предпочтительнее использовать embedding_lookup_sparse, даже если вы не работаете с вложениями.
При принятии решения следует задать два вопроса: нужно ли вычислять градиенты также в разреженном виде? Представлены ли ваши разреженные данные двумя SparseTensor: идентификаторами и значениями? Более подробное объяснение формата данных приведено ниже. Если на любой из этих вопросов ответ «да», рассмотрите использование 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 с гиперпоточностью (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 | SparseTensor A, ранга 2. |
b | Плотное матричное значение, с тем же типом, что и sp_a. |
adjoint_a | Использовать сопряженный оператор A в матричном произведении. Если A комплексное, это transpose(conj(A)). В противном случае это transpose(A). |
adjoint_b | Использовать сопряженный оператор B в матричном произведении. Если B комплексное, это transpose(conj(B)). В противном случае это transpose(B). |
name | Префикс имени для возвращаемых тензоров (необязательно) |
| Возвращаемое значение | |
|---|---|
Плотную матрицу (псевдокод в формате dense 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/r1.15/api_docs/python/tf/sparse/sparse_dense_matmul