2016-10-03 20 views
7

से स्पैर्स मैट्रिक्स मैं एक संकल्पक स्पैस ऑटोनकोडर बना रहा हूं और मुझे एक 4 डी मैट्रिक्स को मूल्यों से भरा बदलने की आवश्यकता है (जिसका आकार [samples, N, N, D] है) एक स्पैर मैट्रिक्स में।एक घने एक Tensorflow

प्रत्येक नमूने के लिए, मेरे पास डी एनएक्सएन फीचर मैप्स हैं। मैं प्रत्येक एनएक्सएन फीचर मैप को एक स्पैर मैट्रिक्स में कनवर्ट करना चाहता हूं, जिसमें अधिकतम मूल्य 1 और 0 अन्य सभी को मैप किया गया है।

मैं इसे रन टाइम पर नहीं करना चाहता लेकिन ग्राफ घोषणा के दौरान (क्योंकि मुझे आवश्यकता है परिणामी स्पैर मैट्रिक्स को अन्य ग्राफ संचालन में इनपुट के रूप में उपयोग करने के लिए), लेकिन मुझे समझ में नहीं आता कि इंडेक्स को स्पैर मैट्रिक्स बनाने के लिए कैसे प्राप्त करें।

+0

आप Tensorflow में या इस रूपांतरण करने के लिए करना चाहते हैं अजगर? यदि पायथन में यह फ़ंक्शन आपको घने से स्पैर मैट्रिक्स (http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.coo_matrix.html#scipy.sparse.coo_matrix) में परिवर्तित करने में मदद कर सकता है और आप कर सकते हैं प्रत्येक फीचर मैप को स्टोर करने के लिए tf.SparseTensor (जो कोओ प्रारूप का उपयोग करता है) का उपयोग करें, और सभी स्पैस टेंसर स्टोर करने के लिए एक सूची का उपयोग करें। –

+0

विशेष रूप से, nonzero() (http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.coo_matrix.nonzero.html#scipy.sparse.coo_matrix.nonzero) आपको nonzero के लिए सूचकांक दे सकता है तत्वों। निश्चित नहीं है कि इसे रनटाइम दृष्टिकोण माना जाता है। ग्राफ़ घोषणा से पहले यह कुछ डेटा प्रीप्रोकैसिंग हो सकता है। क्या रनटाइम पर उत्पन्न 4 डी घने मैट्रिक्स या बस कुछ दिए गए इनपुट डेटा हैं? –

+0

मैं रनटाइम पर ऐसा नहीं करना चाहता (मुझे पता है कि यह numpy के साथ कैसे करना है) लेकिन ग्राफ घोषणा के दौरान (इसलिए Tensorflow के साथ) – Cramer

उत्तर

9

आप tf.where उपयोग कर सकते हैं और tf.gather_nd ऐसा करने के लिए:

import numpy as np 
import tensorflow as tf 

# Make a tensor from a constant 
a = np.reshape(np.arange(24), (3, 4, 2)) 
a_t = tf.constant(a) 
# Find indices where the tensor is not zero 
idx = tf.where(tf.not_equal(a_t, 0)) 
# Make the sparse tensor 
# Use tf.shape(a_t, out_type=tf.int64) instead of a_t.get_shape() 
# if tensor shape is dynamic 
sparse = tf.SparseTensor(idx, tf.gather_nd(a_t, idx), a_t.get_shape()) 
# Make a dense tensor back from the sparse one, only to check result is correct 
dense = tf.sparse_tensor_to_dense(sparse) 
# Check result 
with tf.Session() as sess: 
    b = sess.run(dense) 
np.all(a == b) 
>>> True 
+0

मैं इसे टेंसर के साथ कैसे कर सकता हूं? जैसे मैं एक टेंसर को एक छेड़छाड़ में बदलना चाहता हूं। –

+1

@ रॉकेटपिंगू सुनिश्चित नहीं है कि आपका क्या मतलब है, यह एक घने टेंसर को एक छेड़छाड़ में परिवर्तित करना है। यहां 'a_t' एक नियमित टेंसरफ्लो टेंसर है (इस मामले में' tf.constant 'op से प्राप्त किया जाता है लेकिन यह किसी अन्य ऑप का आउटपुट हो सकता है)। मैंने स्पष्टता के लिए कुछ टिप्पणियां जोड़ दी हैं। – jdehesa

+0

यह ठीक है जब मैंने इसे अपने कोड के लिए कोशिश की, तो उसने मुझे एक त्रुटि दी। यहां पर अधिक जानकारी: https://stackoverflow.com/questions/48201725/converting-tensor-to-a-sparsetensor –

1

सरल कोड tf.SparseTensor घने numpy सरणी परिवर्तित करने के लिए:

def denseNDArrayToSparseTensor(arr): 
    idx = np.where(arr != 0.0) 
    return tf.SparseTensor(np.vstack(idx).T, arr[idx], arr.shape)