2016-05-05 22 views
13

sorun tensorflow ile temel bir kavram anlama yaşıyorum nasıl yapar. İndeksleme tensör okuma/yazma işlemleri için nasıl çalışır? Bu spesifik bir hale getirmek için, ne kadar aşağıdaki numpy örnekler tensorflow tercüme edilebilir (diziler, endeksler ve değerler için tansörleri tahsis edilir):tensorflow indeksleme işini

x = np.zeros((3, 4)) 
row_indices = np.array([1, 1, 2]) 
col_indices = np.array([0, 2, 3]) 
x[row_indices, col_indices] = 2 
x 

çıkışı ile:

array([[ 0., 0., 0., 0.], 
     [ 2., 0., 2., 0.], 
     [ 0., 0., 0., 2.]]) 

.. . ve ... çıkışı ile

x[row_indices, col_indices] = np.array([5, 4, 3]) 
x 

:

array([[ 0., 0., 0., 0.], 
     [ 5., 0., 4., 0.], 
     [ 0., 0., 0., 3.]]) 

... ve nihayet ... çıkışı ile

y = x[row_indices, col_indices] 
y 

:

array([ 5., 4., 3.]) 
+0

pek çok şey tensorflow desteklenmez. Bu soru http://stackoverflow.com/questions/33736795/tensorflow-numpy-like-tensor-indexing Belki daha açıklayabilir bakın ne bu matris değerleri ve kimse güncelleyerek gerçekleştirmek için çalışıyoruz o sonucu elde etmek nasıl cevap verebilir tensorflow. – Aaron

+0

Bağlantı için teşekkürler.Öğrenilen görüntü sınıflandırma ağının genelliğini ümitle geliştirmek için birkaç görüntü büyütme (tensorflow kitaplığında henüz mevcut değil) denemek isterim. Bu operasyonları yürütmek için gradiants'a ihtiyacım yok ve bunu CPU üzerinde kolayca yapabilirim ama bu büyük bir performans darboğazı haline geliyor. Yaroslav'un ​​cevabı ile ihtiyacım olanı yapabilmem gerektiğini düşünüyorum. – Keith

cevap

9

güzel bunu desteklemek için github sorunu #206 var, bu arada, ayrıntılı çözüm yolları

başvurmak zorunda ilk örnek, bir veya diğer

0.123.571, her elemanın seçerek iki aynı şekilli tansörlerine birleştiren tf.select ile yapılabilir scatter_update yalnızca doğrusal endeksleri üzerinde destekler ve değişkenler üzerinde çalışır hariç

,

[[ 0. 0. 0. 0.] 
[ 2. 0. 2. 0.] 
[ 0. 0. 0. 2.]] 

ikincisi scatter_update ile yapılabilir verir. Böylece geçici bir değişken oluşturabilir ve bu şekilde yeniden şekillendirmeyi kullanabilirsiniz. , Sen

print tf.gather_nd(x, coords).eval() 

almak için yazmak

# get linear indices 
linear_indices = row_indices*x.get_shape()[1]+col_indices 

# turn 'x' into 1d variable since "scatter_update" supports linear indexing only 
x_flat = tf.Variable(tf.reshape(x, [-1])) 

# no automatic promotion, so make updates float32 to match x 
updates = tf.constant([5, 4, 3], dtype=tf.float32) 

sess.run(tf.initialize_all_variables()) 
sess.run(tf.scatter_update(x_flat, linear_indices, updates)) 

# convert back into original shape 
x = tf.reshape(x_flat, x.get_shape()) 

print x.eval() 

Nihayet üçüncü örnek zaten gather_nd ile desteklenir

[[ 0. 0. 0. 0.] 
[ 5. 0. 4. 0.] 
[ 0. 0. 0. 3.]] 

verir (eğer dynamic_stitch kullanabilirsiniz değişkenler önlemek için, sonuna bakınız)

[ 5. 4. 3.] 

Düzenleme, 6 Mayıs

seyrek değerlerin vektörünü veya dynamic_stitch

sess = tf.InteractiveSession() 
x = tf.zeros((3, 4)) 
row_indices = tf.constant([1, 1, 2]) 
col_indices = tf.constant([0, 2, 3]) 

# no automatic promotion, so specify float type 
replacement_vals = tf.constant([5, 4, 3], dtype=tf.float32) 

# convert to linear indexing in row-major form 
linear_indices = row_indices*x.get_shape()[1]+col_indices 
x_flat = tf.reshape(x, [-1]) 

# use dynamic stitch, it merges the array by taking value either 
# from array1[index1] or array2[index2], if indices conflict, 
# the later one is used 
unchanged_indices = tf.range(tf.size(x_flat)) 
changed_indices = linear_indices 
x_flat = tf.dynamic_stitch([unchanged_indices, changed_indices], 
          [x_flat, replacement_vals]) 
x = tf.reshape(x_flat, x.get_shape()) 
print x.eval() 
güvenerek alır x[cols,rows]=newvals sparse_to_dense ile select kullanarak (oturum çalıştırmak çağrılar arasında bellek işgal) Değişkenler kullanılmadan yapılabilir güncelleme Eğer Numpy ile yapabileceğiniz
+0

Bu örnekler çok faydalıdır. Teşekkür ederim! – Keith

+2

ortak çalışanının, Değişkenler yerine 'dynamic_stitch' kullanması önerildi, yemek tarifleri güncellendi –