2016-02-12 40 views
21

tôi muốn so sánh các giá trị dự đoán yp từ mạng thần kinh của tôi trong một thời trang cặp, và vì vậy tôi đã sử dụng (trở lại trong việc thực hiện NumPy cũ của tôi):TensorFlow: numpy.repeat() thay thế

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

này về cơ bản tạo một lưới lập chỉ mục mà tôi sử dụng. idx=[0,0,0,1,1,1,...] trong khi jdx=[0,1,2,0,1,2...]. Tôi không biết liệu có cách làm đơn giản hơn hay không ...

Dù sao đi nữa, TensorFlow có tf.tile() nhưng có vẻ như thiếu tf.repeat().

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

Và tôi nhận được lỗi:

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

Nó cũng không hoạt động để sử dụng một hằng số TensorFlow cho việc lập chỉ mục:

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

Các ý tưởng là để chuyển đổicủa tôithực hiện cho TensorFlow.

Trả lời

23

Bạn có thể đạt được hiệu quả của np.repeat() sử dụng một sự kết hợp của tf.tile()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. 

Bạn chỉ có thể tính toán jdx sử dụng tf.tile():

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

Đối với việc lập chỉ mục, bạn có thể thử sử dụng tf.gather() để trích xuất các lát không liền kề từ yp tensor:

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

Dường như có lỗi trong mã? Tôi chạy với 'len (yp) == 4' và đầu ra của' idx' là '[0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3]' và không '[0,0,0, 1,1,1, ...] '. – Clash

+0

Thêm một cuộc gọi 'tf.transpose' sau khi ốp lát nhận được kết quả chính xác' [0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3] '. Dòng chính xác là 'idx = tf.transpose (tf.tile (idx, [len (yp), 1]))'? – Clash

+0

Tốt bắt - câu trả lời thực sự đã đưa ra một cách quá dài để tính toán 'jdx'! Tôi đã cập nhật nó để làm rõ cách người ta có thể tính toán 'idx' và' jdx'. – mrry

1

Dường như câu hỏi của bạn quá phổ biến đến mức mọi người refer it on TF tracker. Đáng buồn thay, chức năng tương tự vẫn chưa được thực hiện trong TF.

Bạn có thể triển khai bằng cách kết hợp tf.tile, tf.reshape, tf.squeeze. Dưới đây là một cách để chuyển đổi các ví dụ từ 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))) 

Trong trường hợp cuối cùng mà lặp đi lặp lại khác nhau đối với mỗi yếu tố bạn có lẽ hầu hết sẽ cần loops.

0

Chỉ trong trường hợp ai đó quan tâm đến phương pháp 2D để sao chép ma trận. Tôi nghĩ rằng điều này có thể hoạt động:

TF_obj = tf.zeros([128, 128]) 
tf.tile(tf.expand_dims(TF_obj, 2), [1, 1, 2]) 
Các vấn đề liên quan