2016-02-12 10 views
21

मैं एक जोड़ो में फैशन में मेरी तंत्रिका नेटवर्क से भविष्यवाणी की मानों yp तुलना करना चाहते हैं, और इसलिए मैं (वापस मेरे पुराने numpy कार्यान्वयन में) का उपयोग किया गया था:TensorFlow: numpy.repeat() विकल्प

idx = np.repeat(np.arange(len(yp)), len(yp)) 
jdx = np.tile(np.arange(len(yp)), len(yp)) 
s = yp[[idx]] - yp[[jdx]] 

यह मूल रूप से एक इंडेक्सिंग जाल बनाते हैं जिसका मैं उपयोग करता हूं। idx=[0,0,0,1,1,1,...] जबकि jdx=[0,1,2,0,1,2...]। मुझे नहीं पता कि यह करने का एक आसान तरीका है ...

किसी भी तरह, टेंसरफ्लो में tf.tile() है, लेकिन ऐसा लगता है कि tf.repeat() की कमी है।

idx = np.repeat(np.arange(n), n) 
v2 = v[idx] 

और मैं त्रुटि मिलती है:

TypeError: Bad slice index [ 0 0 0 ..., 215 215 215] of type <type 'numpy.ndarray'> 

यह भी अनुक्रमण के लिए एक TensorFlow निरंतर उपयोग करने के लिए काम नहीं करता:

idx = tf.constant(np.repeat(np.arange(n), n)) 
v2 = v[idx] 

-

TypeError: Bad slice index Tensor("Const:0", shape=TensorShape([Dimension(46656)]), dtype=int64) of type <class 'tensorflow.python.framework.ops.Tensor'> 

विचार मेरेको परिवर्तित करना है TensorFlow के लिएकार्यान्वयन।

उत्तर

23

आप tf.tile() और tf.reshape() के संयोजन का उपयोग np.repeat() के प्रभाव को प्राप्त कर सकते हैं:,

jdx = tf.range(len(yp)) 
jdx = tf.tile(jdx, [len(yp)]) 

अनुक्रमण के लिए आप tf.gather() का उपयोग कर की कोशिश कर सकते:

idx = tf.range(len(yp)) 
idx = tf.reshape(idx, [-1, 1]) # Convert to a len(yp) x 1 matrix. 
idx = tf.tile(idx, [1, len(yp)]) # Create multiple columns. 
idx = tf.reshape(idx, [-1])  # Convert back to a vector. 

आप बस tf.tile() का उपयोग कर की गणना कर सकता jdxyp टेंसर से गैर-संगत स्लाइस निकालने के लिए:

s = tf.gather(yp, idx) - tf.gather(yp, jdx) 
+0

ऐसा लगता है कि कोड में कोई गलती है? मैं 'लेन (वाईपी) == 4' के साथ भाग गया और' idx' का उत्पादन '0 0 2 2 0 1 2 3 0 1 2 3 0 1 2 3]' और नहीं '[0,0,0, 1,1,1, ...] '। – Clash

+0

टाइलिंग के बाद 'tf.transpose' कॉल जोड़ना सही आउटपुट प्राप्त करता है' [0 0 0 1 1 1 1 2 2 2 2 3 3 3 3] '। सही रेखा 'idx = tf.transpose है (tf.tile (idx, [len (yp), 1]))'? – Clash

+0

अच्छी पकड़ - जवाब वास्तव में 'jdx' की गणना करने के लिए एक अत्यधिक लंबी हवादार रास्ता दिया! मैंने इसे स्पष्ट करने के लिए अद्यतन किया कि कैसे किसी को 'idx' और' jdx' की गणना की जा सकती है। – mrry

1

ऐसा लगता है कि आपका प्रश्न इतना लोकप्रिय है कि लोग refer it on TF tracker। अफसोस की बात है कि एक ही समारोह अभी भी टीएफ में लागू नहीं किया गया है।

आप tf.tile, tf.reshape, tf.squeeze के संयोजन से इसे कार्यान्वित कर सकते हैं।

import numpy as np 
import tensorflow as tf 

x = [[1,2],[3,4]] 
print np.repeat(3, 4) 
print np.repeat(x, 2) 
print np.repeat(x, 3, axis=1) 

x = tf.constant([[1,2],[3,4]]) 
with tf.Session() as sess: 
    print sess.run(tf.tile([3], [4])) 
    print sess.run(tf.squeeze(tf.reshape(tf.tile(tf.reshape(x, (-1, 1)), (1, 2)), (1, -1)))) 
    print sess.run(tf.reshape(tf.tile(tf.reshape(x, (-1, 1)), (1, 3)), (2, -1))) 

पिछले मामले में जहां दोहराता प्रत्येक तत्व आप सबसे शायद loops की आवश्यकता होगी के लिए अलग हैं में: यहाँ एक तरह से np.repeat से उदाहरण कन्वर्ट करने के लिए है।

0

बस अगर किसी को matrices की प्रतिलिपि बनाने के लिए 2 डी विधि के लिए रूचि है। मुझे लगता है कि यह काम कर सकता है:

TF_obj = tf.zeros([128, 128]) 
tf.tile(tf.expand_dims(TF_obj, 2), [1, 1, 2])