2017-03-02 6 views
0

Ich mache eine Matrix Factorization in TensorFlow, ich möchte coo_matrix von Spicy.sparse verwenden, weil es weniger Speicher benötigt und es einfach macht, alle meine Daten in meine Matrix für Trainingsdaten zu legen.Verwenden Sie coo_matrix in TensorFlow

Ist es möglich, coo_matrix zu verwenden, um eine Variable im Tensorflow zu initialisieren?

Oder muss ich eine Sitzung erstellen und die Daten, die ich in Tensorflow bekam mit sess.run() mit feed_dict füttern.

Ich hoffe, dass Sie meine Frage verstehen und mein Problem sonst kommentieren und ich werde versuchen, es zu beheben.

Antwort

5

Die nächste Sache, die TensorFlow hat, ist scipy.sparse.coo_matrix ist tf.SparseTensor, die das spärliche Äquivalent von tf.Tensor ist. Es wird wahrscheinlich am einfachsten sein, eine coo_matrix in Ihr Programm zu füttern.

A tf.SparseTensor ist eine leichte Verallgemeinerung des COO-Matrices, wobei die Tensor als drei dichte tf.Tensor Objekte dargestellt wird:

  • indices: Eine N x D Matrix von tf.int64 Werten bei der jede Zeile, die Koordinaten eines darstellt Wert ungleich Null. N ist die Anzahl der Nicht-Nullen und D ist der Rang des äquivalenten dichten Tensors (2 im Falle einer Matrix).
  • values: A längen- N Vektor von Werten, wobei der Wert i Element des Elements, dessen Koordinaten auf der Reihe von indicesi gegeben sind.
  • dense_shape: Eine Länge Vektor von tf.int64, die Form des äquivalenten dichten Tensors darstellt.

Zum Beispiel könnten Sie den folgenden Code verwenden, die tf.sparse_placeholder() eine tf.SparseTensor zu definieren verwendet, die man füttern kann, und einen tf.SparseTensorValue, der den Istwert darstellt zugeführt wird:

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) 

Sobald Sie konvertiert haben Ihre coo_matrix zu einem tf.SparseTensorValue, können Sie sparse_input mit dem tf.SparseTensorValue direkt füttern:

sess.run(train_op, feed_dict={sparse_input: tf_coo_matrix}) 
+0

Danke, th Das war was ich wollte. Aber warum tun Sie sparse_input = tf.sparse_placeholder (dtype = tf.float32, shape = [100, 100]) –

+0

Es ist nur ein Beispiel für die Erstellung eines 'tf.SparseTensor' für Sie zu füttern. Sie brauchen nicht diesen bestimmten 'dtype' oder' shape' zu ​​verwenden, und Sie können jeden 'tf.SparseTensor' mit Ihrem konstruierten' tf.SparseTensorValue' füttern (solange er einen kompatiblen 'dtype' und' shape' hat)). – mrry

+0

Danke für eine schnelle Antwort. –

Verwandte Themen