2016-01-25 24 views
19

Câu hỏi của tôi là ở hai phần kết nối:TensorFlow: Max của một tensor dọc theo một trục

  1. Làm thế nào để tính toán tối đa dọc theo một trục nhất định của một tensor? Ví dụ, nếu tôi có

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

    Tôi muốn một cái gì đó giống như

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

    Tôi biết có một tf.argmaxtf.maximum, nhưng không cung cấp cho các giá trị lớn nhất dọc theo một trục của một tensor duy nhất. Hiện tại, tôi có một giải pháp thay thế:

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

    Nhưng có vẻ ít hơn tối ưu. Có cách nào tốt hơn để làm điều này?

  2. Với chỉ số của một argmax của một tensor, làm thế nào để tôi lập chỉ mục vào một tensor khác bằng cách sử dụng các chỉ số đó? Sử dụng ví dụ của x trên, làm thế nào để tôi làm điều gì đó như sau:

    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] 
    

    Tôi biết cắt, giống như dòng cuối cùng, không tồn tại trong TensorFlow chưa (#206).

    Câu hỏi của tôi là: cách giải quyết tốt nhất cho trường hợp cụ thể của tôi (có thể sử dụng các phương pháp khác như thu thập, chọn, v.v.) là gì?

    Thông tin bổ sung: Tôi biết xy sẽ trở thành chỉ hai chiều!

Trả lời

43

Toán tử tf.reduce_max() cung cấp chính xác chức năng này. Theo mặc định, nó tính toán mức tối đa toàn cầu của tensor đã cho, nhưng bạn có thể chỉ định danh sách reduction_indices, có cùng nghĩa là axis trong NumPy. Để hoàn thành ví dụ của bạn:

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

Nếu bạn tính toán argmax sử dụng tf.argmax(), bạn có thể có được các giá trị từ một tensor khác nhau y bằng phẳng y sử dụng tf.reshape(), chuyển đổi các chỉ số argmax vào chỉ số véc tơ như sau, và sử dụng tf.gather() để trích xuất các giá trị thích hợp:

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

Để hoàn thành, trong ví dụ thứ hai, hãy thêm vào dòng thứ 3: 'amax = tf.argmax (y, 1)' và xóa dòng đầu tiên. –

+0

'reduce_indices' không được chấp nhận. sử dụng 'trục' thay thế –

Các vấn đề liên quan