2015-11-16 26 views
19

numpy में, हम यह कर सकते हैं:TensorFlow - numpy की तरह टेन्सर अनुक्रमण

x = np.random.random((10,10)) 
a = np.random.randint(0,10,5) 
b = np.random.randint(0,10,5) 
x[a,b] # gives 5 entries from x, indexed according to the corresponding entries in a and b 

जब मैं TensorFlow में कुछ बराबर का प्रयास करें:

xt = tf.constant(x) 
at = tf.constant(a) 
bt = tf.constant(b) 
xt[at,bt] 

अंतिम पंक्ति में "बैड टुकड़ा सूचकांक टेन्सर देता है "अपवाद। ऐसा लगता है कि TensorFlow numpy या Theano जैसे अनुक्रमण का समर्थन नहीं करता है।

क्या कोई यह जानता है कि ऐसा करने का कोई टेंसरफ्लो तरीका है (मनमानी मूल्यों से एक टेंसर को अनुक्रमणित करना)। मैंने tf.nn.embedding भाग देखा है, लेकिन मुझे यकीन नहीं है कि इसका उपयोग इस के लिए किया जा सकता है और यहां तक ​​कि यदि वे कर सकते हैं, तो यह इस सीधा के लिए एक बड़ा कामकाज है।

(अभी, मैं एक इनपुट के रूप x से डेटा खिला और numpy में अनुक्रमण कर, लेकिन मैं TensorFlow अंदर x डाल करने के लिए उच्च दक्षता प्राप्त करने के लिए आशा व्यक्त की कर रहा हूँ)

+2

इस समस्या को ठीक से संबोधित करना प्रतीत होता है: https://github.com/tensorflow/tensorflow/issues/206 – LDGN

उत्तर

8

LDGN की टिप्पणी सही है। इस समय यह संभव नहीं है, और एक अनुरोधित सुविधा है। यदि आप issue#206 on github का पालन करते हैं तो यह अपडेट हो जाएगा यदि यह उपलब्ध है। बहुत से लोग इस सुविधा को पसंद करेंगे।

1

टीएफ 0.11 के लिए, मूल अनुक्रमण लागू किया गया है। अधिक उन्नत अनुक्रमण (जैसे बुलियन इंडेक्सिंग) अभी भी गायब है, लेकिन स्पष्ट रूप से भविष्य के संस्करणों के लिए योजना बनाई गई है।

में उन्नत अनुक्रमण https://github.com/tensorflow/tensorflow/issues/4638

7

साथ ट्रैक किया जा सकता तुम वास्तव में कर सकते हैं अब tf.gather_nd साथ कि। मान लीजिए कि आप एक मैट्रिक्स है m निम्नलिखित की तरह करते हैं:

| 1 2 3 4 | 
| 5 6 7 8 | 

और तुम इस तरह m के तत्वों से बनाया गया एक मैट्रिक्स 3x2 निर्माण करने के लिए आकार की r, मान लें कि, चाहते हैं,,:

| 3 6 | 
| 2 7 | 
| 5 3 | 
| 1 1 | 

r का प्रत्येक तत्व m की पंक्ति और कॉलम से मेल खाता है, और आप इन इंडेक्स के साथ rows और cols मैट्रिक्स कर सकते हैं (शून्य-आधारित, क्योंकि हम प्रोग्रामिंग कर रहे हैं, गणित नहीं कर रहे हैं!):

 | 0 1 |   | 2 1 | 
rows = | 0 1 | cols = | 1 2 | 
     | 1 0 |   | 0 2 | 
     | 0 0 |   | 0 0 | 

जो तुम इस तरह एक 3 आयामी टेन्सर में ढेर कर सकते हैं:

| | 0 2 | | 1 1 | | 
| | 0 1 | | 1 2 | | 
| | 1 0 | | 2 0 | | 
| | 0 0 | | 0 0 | | 

इस तरह, आप m से r को rows के माध्यम से इस प्रकार मिलता है और cols कर सकते हैं:

import numpy as np 
import tensorflow as tf 

m = np.array([[1, 2, 3, 4], [5, 6, 7, 8]]) 
rows = np.array([[0, 1], [0, 1], [1, 0], [0, 0]]) 
cols = np.array([[2, 1], [1, 2], [0, 2], [0, 0]]) 

x = tf.placeholder('float32', (None, None)) 
idx1 = tf.placeholder('int32', (None, None)) 
idx2 = tf.placeholder('int32', (None, None)) 
result = tf.gather_nd(x, tf.stack((idx1, idx2), -1)) 

with tf.Session() as sess: 
    r = sess.run(result, feed_dict={ 
     x: m, 
     idx1: rows, 
     idx2: cols, 
    }) 
print(r) 

आउटपुट:

[[ 3. 6.] 
[ 2. 7.] 
[ 5. 3.] 
[ 1. 1.]] 
+0

क्या आप इस कोड को थोड़ा सा समझा सकते हैं? –

+0

@Mr_and_Mrs_D अच्छी तरह से 'tf.gather_nd' क्या सटीक कल्पना है, आप इसे दस्तावेज़ों में देख सकते हैं। लेकिन मूल रूप से, विचार है कि मैं एक मैट्रिक्स 'परिणाम' कहना चाहता हूं, कहें, एमएक्सएन, प्रत्येक तत्व को अन्य मैट्रिक्स 'x' से लिया गया था। प्रत्येक तत्व के लिए मेरे पास 'x' की इसी पंक्ति और कॉलम है; ये 'idx1' और' idx2' हैं।मैंने इन दो को एक एमएक्सएनएक्स 2 टेंसर प्राप्त करने के लिए ढेर किया है, चलिए इसे 'idx12' कहते हैं। 'tf.gather_nd'' idx12' के अंतिम आयाम का उपयोग करता है (जिसमें आकार 2 है, जैसे 'x' में आयामों की संख्या), दो-आयामी सूचकांक बनाने के लिए जो 'परिणाम' में जाने वाले तत्वों को देखने के लिए उपयोग किए जाते हैं । – jdehesa

+0

कृपया उन्हें अपने उत्तर में जोड़ें रैंड मैं ऊपर उठाऊंगा - दस्तावेज़ हैं, उह, कुछ हद तक कमी है। आपको अभी भी समझा जाना चाहिए कि एमएक्सएन का संबंध idx1/2 –

संबंधित मुद्दे