2015-11-16 22 views
19

, bunu yapabiliriz:TensorFlow - numpy benzeri tensör indeksleme Numpy olarak

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 

Ben TensorFlow eşdeğer bir şey çalıştığınızda:

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

son satırı bir "Kötü dilim endeksi tensörünü verir "istisna. TensorFlow, numpy veya Theano gibi dizinlemeyi desteklemiyor gibi görünüyor.

Bunu yapmanın bir TensorFlow yolu olup olmadığını bilen herhangi biri var mı (bir tensörü keyfi değerlerle indekslemek). Tf.nn.embedding parçasını gördüm, ancak bunun için kullanılabileceğinden emin değilim ve yapabilseler bile, bu basit bir şey için büyük bir çözümdür.

(Şu anda, girdi olarak x veri besleme ve Numpy içinde indeksleme yapıyor ama daha yüksek verim elde etmek için TensorFlow içine x koymak ümit ediyorum)

+2

bu sorun tam olarak şu şekilde görünüyor: https://github.com/tensorflow/tensorflow/issues/206 – LDGN

cevap

8

LDGN en comment doğrudur. Bu şu anda mümkün değildir ve istenen bir özelliktir. issue#206 on github'u takip ederseniz,/olduğunda bu durum güncellenir. Birçok kişi bu özelliği ister.

7

ile izlenebilir Aslında yapabilirsiniz şimdi tf.gather_nd o. Diyelim ki aşağıdaki gibi m bir matris var diyelim:

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

Ve böyle, m unsurları inşa, diyelim, büyüklüğü r 3x2 bir matris oluşturmak istiyorum:

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

r öğesinin her bir öğesi m numaralı satıra ve sütuna karşılık gelir ve bu dizinlerle rows ve cols matrislerine sahip olabilirsiniz (sıfırlandığımız için sıfır tabanlı, matematik yapıyoruz!):

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

Böyle bir 3 boyutlu tensör içine yığabilirsiniz hangisi şu şekildedir:

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

Bu şekilde, colsrows aracılığıyla r için m almak ve edebilirsiniz:

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) 

Çıkış:

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

Bu kodun ne yaptığını biraz açıklayabilir misiniz? –

+0

@Mr_and_Mrs_D 'tf.gather_nd' ifadesinin tam olarak ne anlama geldiğiyle ilgili kesin bir bilgi varsa, dokümanlar arasında kontrol edebilirsiniz. Ama temel olarak, fikir, her bir elemanın başka bir matrisinden (xx) alınan bir “matrisi” sonucunu istiyorum. Her eleman için ilgili satır ve 'x' sütununa sahibim; Bunlar idx1 ve idx2'dir.Bir MxNx2 tensörü elde etmek için bu iki parçayı topladım, diyelim ki 'idx12' diyelim. 'tf.gather_nd'' '' sonuca giden öğeleri aramak için kullanılan iki boyutlu indeksler yaratmak için 'idx12' nin son boyutunu kullanır (x'de boyutların sayısı gibi boyut 2’dir) . – jdehesa

+0

Lütfen bunları cevabınıza ekleyin. Yakında yazacağım - dokümanlar, ugh, biraz eksik. MxN ile olan ilişkinin hala ne olduğunu açıklamalısınız: idx1/2 –