2015-11-17 14 views
12

के साथ टेन्सफोर्लो इंडेक्सिंग एक ही आकार के दो सरणी, x और y के साथ, y[x > 1] जैसे स्लाइस करना संभव है। आप tensorflow में एक ही परिणाम कैसे प्राप्त करते हैं? y[tf.greater(x, 1)] काम नहीं करता है और tf.slice इस तरह कुछ भी समर्थन नहीं करता है। क्या अभी बूलियन टेंसर के साथ इंडेक्स करने का कोई तरीका है या वर्तमान में असमर्थित है?बूलोलेन टेंसर

+2

अब आप https://www.tensorflow.org/api_docs/python/array_ops/slicing_and_joining#boolean_mask tf.boolean_select उपयोग कर सकते हैं –

उत्तर

3

यह इस पल में लागू नहीं किया गया है, यहाँ प्रगति पर नज़र रखने GitHub मुद्दा है - https://github.com/tensorflow/tensorflow/issues/206

+1

अब में पता लगाया जा रहा: https://github.com/tensorflow/tensorflow/मुद्दों/4639 –

5

मैं इसे यह नहीं कहूंगा पूरी तरह से लागू नहीं है। यह दोहरी नकारात्मक के लिए कैसा है?

टेन्सफोर्लो वास्तव में बहुत सारे टुकड़े टुकड़े और डाइसिंग का समर्थन करता है, हालांकि वाक्यविन्यास थोड़ा कम सुंदर हो सकता है। उदाहरण के लिए, यदि आप y के बराबर एक नई सरणी बनाना चाहते हैं, तो x>1 पर 0 के बराबर है, लेकिन आप निश्चित रूप से ऐसा कर सकते हैं। comparison operators देखें

masked = tf.greater(x,1) 
zeros = tf.zeros_like(x) 
new_tensor = tf.where(masked, y, zeros) 

, तो दूसरी ओर, यदि आप एक नई सरणी जो केवल लोगों को जहां x>1 आप कर सकते हैं कि gather समारोह के साथ where के संयोजन के द्वारा होता है बनाना चाहते हैं। gather के लिए विवरण

https://www.tensorflow.org/versions/master/api_docs/python/array_ops/slicing_and_joining

पी एस में पाया जा सकता। बेशक, x>1x के संबंध में अलग नहीं है ... टीएफ बहुत अच्छा हो सकता है, लेकिन यह जादू काम नहीं करता है :)।

+0

लेकिन दोनों 'चयन' और 'कहां' एक इनपुट के रूप में एक बुलियन मुखौटा लेते हैं। एक इनपुट के रूप में टेंसर 'x' कैसे लेता है और एक बुलियन मास्क का उत्पादन करता है जो' True' कहां है 'x> 1'? –

+0

ऐसा लगता है कि मैं तुलना ऑपरेटर की तलाश में हूं: https://www.tensorflow.org/versions/r0.11/api_docs/python/control_flow_ops.html#comparison-operators –

12

प्रयास करें:

ones = tf.ones_like(x) # create a tensor all ones 
mask = tf.greater(x, ones) # boolean tensor, mask[i] = True iff x[i] > 1 
slice_y_greater_than_one = tf.boolean_mask(y, mask) 

देखें tf.boolean_mask

संपादित: यह करने के लिए एक और (? बेहतर) तरीका:

import tensorflow as tf 

x = tf.constant([1, 2, 0, 4]) 
y = tf.Variable([1, 2, 0, 4]) 
mask = x > 1 
slice_y_greater_than_one = tf.boolean_mask(y, mask) 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    print (sess.run(slice_y_greater_than_one)) # [2 4] 
0

tf.boolean_mask काम करता है, लेकिन जैसे कुछ प्लेटफार्मों पर रास्पबेरी पीआई या ओएसएक्स, ऑपरेशन टेन्सफोर्लो व्हील वितरण में समर्थित नहीं है (यहदेखें। तो वैकल्पिक विकल्प where और gather का उपयोग करना है क्योंकि जैकसन लोपर ने सुझाव दिया था। उदाहरण के लिए:

x = tf.Variable([1, 2, 0, 4]) 
ix = tf.where(x > 1) 
y = tf.gather(x, ix) 

with tf.Session() as sess: 
sess.run(tf.global_variables_initializer()) 
print(sess.run(y)) 
संबंधित मुद्दे