2016-01-25 11 views
19

moje pytanie składa się z dwóch połączonych ze sobą części:TensorFlow: Max tensora wzdłuż osi

  1. W jaki sposób obliczyć max wzdłuż pewnej osi tensora? Na przykład, jeśli mam

    x = tf.constant([[1,220,55],[4,3,-1]]) 
    

    chcę coś takiego

    x_max = tf.max(x, axis=1) 
    print sess.run(x_max) 
    
    output: [220,4] 
    

    wiem, że to tf.argmax i tf.maximum, ale nie daje maksymalną wartość wzdłuż osi pojedynczej tensora. Na razie mam obejście:

    x_max = tf.slice(x, begin=[0,0], size=[-1,1]) 
    for a in range(1,2): 
        x_max = tf.maximum(x_max , tf.slice(x, begin=[0,a], size=[-1,1])) 
    

    Ale wygląda mniej niż optymalnie. Czy jest lepszy sposób to zrobić?

  2. Biorąc pod uwagę indeksy argmax tensora, w jaki sposób mogę indeksować do innego tensora za pomocą tych indeksów? Na przykładzie x powyżej, jak mam zrobić coś jak następuje:

    ind_max = tf.argmax(x, dimension=1) #output is [1,0] 
    y = tf.constant([[1,2,3], [6,5,4]) 
    y_ = y[:, ind_max]      #y_ should be [2,6] 
    

    wiem krojenia, jak w ostatnim wierszu, nie istnieje w TensorFlow jeszcze (#206).

    Moje pytanie brzmi: jakie jest najlepsze obejście tego konkretnego przypadku (może przy użyciu innych metod, takich jak zbieranie, wybieranie itp.)?

    Dodatkowe informacje: Wiem, że x i y będą tylko tensorami dwuwymiarowymi!

Odpowiedz

43

Operator tf.reduce_max() zapewnia dokładnie tę funkcję. Domyślnie oblicza globalne maksimum danego tensora, ale można podać listę reduction_indices, która ma takie samo znaczenie jak axis w NumPy. Aby dokończyć przykład:

x = tf.constant([[1, 220, 55], [4, 3, -1]]) 
x_max = tf.reduce_max(x, reduction_indices=[1]) 
print sess.run(x_max) # ==> "array([220, 4], dtype=int32)" 

Jeśli obliczyć argmax korzystając tf.argmax(), można uzyskać wartości z innego tensora y przez spłaszczenie y użyciu tf.reshape(), przekształcanie indeksów argmax język indeksów wektora w następujący sposób i przy użyciu tf.gather() wyodrębnić odpowiednie wartości:

ind_max = tf.argmax(x, dimension=1) 
y = tf.constant([[1, 2, 3], [6, 5, 4]]) 

flat_y = tf.reshape(y, [-1]) # Reshape to a vector. 

# N.B. Handles 2-D case only. 
flat_ind_max = ind_max + tf.cast(tf.range(tf.shape(y)[0]) * tf.shape(y)[1], tf.int64) 

y_ = tf.gather(flat_y, flat_ind_max) 

print sess.run(y_) # ==> "array([2, 6], dtype=int32)" 
+0

pod względem kompletności, w drugim przykładzie, należy dodać na 3 linii: 'Amax = tf.argmax (y, 1)' i usuwania pierwszej linii. –

+0

'reduction_indices' jest przestarzałe. zamiast tego użyj 'axis' –

Powiązane problemy