Документация tf.sparse.sparse_dense_matmul
выглядит следующим образом:
Однако для оптимального поведения рекомендуется следующий формат ввода:
Если adjoint_a == false: A следует отсортировать в лексикографически возрастающем порядке. Используйте sparse.reorder, если вы не уверены. Если adjoint_a == true: A должен быть отсортирован в порядке возрастания измерения 1 (т. Е. В порядке «основной столбец» вместо «основной порядок строк»).
Что означает «оптимальное поведение» и работает ли он также без упорядоченных индексов?
Когда * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *, который не использует упорядочивание, примерно в 30 раз медленнее, чем без упорядочивания.
value = tf.concat([value00[valid00], value01[valid01], value10[valid10], value11[valid11]], axis=0)
idxRow = tf.concat([idx00[valid00], idx01[valid01], idx10[valid10], idx11[valid11]], axis=0)
idxCol = tf.concat([mesh[valid00], mesh[valid01], mesh[valid10], mesh[valid11]], axis=0)
sparseTensor = tf.sparse.SparseTensor(
indices=tf.transpose([idxRow, idxCol]),
values=value,
dense_shape=[batchSize * xSize * ySize, batchSize * xSize * ySize]
)
sparseTensor = tf.sparse.reorder(sparseTensor)
movedFlat = tf.sparse.sparse_dense_matmul(sparseTensor, tf.reshape(tf.transpose(img_ref, perm = [0, 2, 1]),
[tf.shape(img_ref)[0] * img_ref.shape[1] * img_ref.shape[2], 1]))
result = tf.transpose(tf.reshape(movedFlat, (tf.shape(img_ref)[0], img_ref.shape[2], img_ref.shape[1])), perm = [0, 2, 1])