Используйте coo_matrix в TensorFlow

Я делаю матричную факторизацию в TensorFlow, я хочу использовать coo_matrix из Spicy.sparse, потому что он использует меньше памяти и позволяет легко помещать все мои данные в мою матрицу для обучения данных.

Можно ли использовать coo_matrix для инициализации переменной в tenorflow?

Или я должен создать сеанс и передать полученные данные в тензорный поток, используя sess.run() с feed_dict.

Я надеюсь, что вы понимаете мой вопрос и мою проблему, иначе прокомментируйте, и я постараюсь это исправить.

1 ответ

Решение

Ближайшая вещь, которую TensorFlow должен scipy.sparse.coo_matrix является tf.SparseTensor, что является редким эквивалентом tf.Tensor, Вероятно, будет проще всего накормить coo_matrix в вашу программу.

tf.SparseTensor является небольшим обобщением матриц COO, где тензор представлен в виде трех плотных tf.Tensor объекты:

  • indices: An N Икс D матрица tf.int64 значения, в которых каждая строка представляет координаты ненулевого значения. N число ненулевых, и D является рангом эквивалентного плотного тензора (2 в случае матрицы).
  • values: Длина- N вектор значений, где элемент i это значение элемента, координаты которого приведены в строке i из indices,
  • dense_shape: Длина- D вектор tf.int64, представляющий форму эквивалентного плотного тензора.

Например, вы можете использовать следующий код, который использует tf.sparse_placeholder() определить tf.SparseTensor что вы можете накормить, и tf.SparseTensorValue что представляет собой фактическое значение, которое подается:

sparse_input = tf.sparse_placeholder(dtype=tf.float32, shape=[100, 100])
# ...
train_op = ...

coo_matrix = scipy.sparse.coo_matrix(...)

# Wrap `coo_matrix` in the `tf.SparseTensorValue` form that TensorFlow expects.
# SciPy stores the row and column coordinates as separate vectors, so we must 
# stack and transpose them to make an indices matrix of the appropriate shape.
tf_coo_matrix = tf.SparseTensorValue(
    indices=np.array([coo_matrix.rows, coo_matrix.cols]).T,
    values=coo_matrix.data,
    dense_shape=coo_matrix.shape)

Как только вы преобразовали свой coo_matrix к tf.SparseTensorValue можно кормить sparse_input с tf.SparseTensorValue непосредственно:

sess.run(train_op, feed_dict={sparse_input: tf_coo_matrix})
Другие вопросы по тегам