2016-02-12 24 views
21

Chcę porównać przewidywane wartości yp z mojej sieci neuronowych w modzie parami, a więc używałem (w moim starym numpy realizacji):TensorFlow: numpy.repeat() alternatywa

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

ten po prostu stwórz siatkę indeksującą, którą następnie wykorzystam. idx=[0,0,0,1,1,1,...] podczas gdy jdx=[0,1,2,0,1,2...]. Nie wiem, czy jest prostszy sposób robienia tego ...

W każdym razie TensorFlow ma tf.tile(), ale wydaje się brakować tf.repeat().

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

I pojawia się błąd:

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

To również nie działa użyć stałej TensorFlow do indeksowania:

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'> 

The Pomysł polega na konwersji mojego RankNet wdrożenie do TensorFlow.

Odpowiedz

23

można osiągnąć efekt np.repeat() stosując kombinację tf.tile() i tf.reshape():

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. 

Można po prostu obliczyć jdx użyciu tf.tile():

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

Dla indeksowania, można spróbować użyć tf.gather() w celu wyodrębnienia nieciągłych wycinków z tensora yp:

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

Czy w kodzie jest błąd? Pobiegłem z 'len (yp) == 4', a wyjście' idx' było '[0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3]' a nie '[0,0,0, 1,1,1, ...] ". – Clash

+0

Dodanie wywołania 'tf.transpose' po wstawieniu kafelka otrzymuje poprawne wyjście' [0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3] '. Poprawną linią jest 'idx = tf.transpose (tf.tile (idx, [len (yp), 1]))'? – Clash

+0

Dobry połów - odpowiedź w rzeczywistości dawała zbyt długi sposób obliczania "jdx"! Zaktualizowałem go, aby wyjaśnić, w jaki sposób można obliczyć "idx" i "jdx". – mrry

1

Wygląda na to, że twoje pytanie jest tak popularne, że ludzie refer it on TF tracker. Niestety ta sama funkcja nie jest nadal stosowana w TF.

Można go wdrożyć, łącząc tf.tile, tf.reshape, tf.squeeze. Oto sposób na konwersję przykładów z np.repeat:

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))) 

W ostatnim przypadku powtórzenia są różne dla każdego elementu, który najprawdopodobniej będzie musiał loops.

0

Na wypadek, gdyby ktokolwiek był zainteresowany metodą 2D do skopiowania macierzy. Myślę, że to może zadziałać:

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