2016-02-02 29 views
26

Câu hỏi này liên quan đến việc truy cập các phần tử riêng lẻ trong một tensor, nói [[1,2,3]]. Tôi cần phải truy cập vào phần tử bên trong [1,2,3] (Điều này có thể được thực hiện bằng cách sử dụng .eval() hoặc sess.run()) nhưng phải mất nhiều thời gian hơn khi kích thước của tensor là rất lớn)python dòng chảy: Truy cập các phần tử riêng lẻ trong một tensor

Có bất kỳ phương pháp để làm cùng nhanh hơn?

Cảm ơn trước.

Trả lời

0

Tôi cho rằng đó là phần còn lại của tính toán cần có thời gian, thay vì truy cập vào một phần tử.

Ngoài ra kết quả có thể yêu cầu một bản sao từ bất kỳ bộ nhớ nào được lưu trữ, vì vậy nếu nó ở trên cạc đồ họa, nó sẽ cần được sao chép trở lại RAM trước và sau đó bạn có quyền truy cập vào phần tử của mình. Nếu đây là trường hợp bạn có thể bỏ qua nó bằng cách thêm một hoạt động tensorflow để lấy phần tử đầu tiên và chỉ trả về phần tử đó.

36

Có hai cách chính để truy cập tập hợp con của các phần tử trong một tensor, một trong hai cách này sẽ hoạt động cho ví dụ của bạn.

  1. Sử dụng toán tử lập chỉ mục (dựa trên tf.slice()) để trích xuất một lát liền kề từ bộ căng.

    input = tf.constant([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) 
    
    output = input[0, :] 
    print sess.run(output) # ==> [1 2 3] 
    

    Toán tử lập chỉ mục hỗ trợ nhiều thông số kỹ thuật lát giống như NumPy.

  2. Sử dụng công cụ tf.gather() để chọn một đoạn không liền kề từ bộ căng.

    input = tf.constant([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) 
    
    output = tf.gather(input, 0) 
    print sess.run(output) # ==> [1 2 3] 
    
    output = tf.gather(input, [0, 2]) 
    print sess.run(output) # ==> [[1 2 3] [7 8 9]] 
    

    Lưu ý rằng tf.gather() chỉ cho phép bạn chọn toàn bộ lát trong chiều 0 (toàn bộ hàng trong ví dụ của một ma trận), vì vậy bạn có thể cần phải tf.reshape() hoặc tf.transpose() đầu vào của bạn để có được những yếu tố thích hợp.

+1

".. vì vậy bạn có thể cần phải tf.reshape() hoặc tf.transpose() đầu vào của bạn để có được các yếu tố thích hợp." -> hoặc sử dụng 'tf.gather_nd'? –

1

Bạn chỉ đơn giản là không thể có được giá trị của nguyên tố 0 của [[1,2,3]] mà không run() - ning hoặc eval() - ing một hoạt động mà sẽ được nhận nó. Bởi vì trước khi bạn 'chạy' hoặc 'eval', bạn chỉ có một mô tả làm thế nào để có được yếu tố bên trong này (vì TF sử dụng các biểu đồ/tính toán biểu tượng). Vì vậy, ngay cả khi bạn sử dụng tf.gather/tf.slice, bạn vẫn sẽ phải nhận các giá trị của các hoạt động này thông qua eval/run. Xem câu trả lời của @ mrry.

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