2016-08-06 29 views
5

Tôi có một biến a của kích thước (1, 5) mà tôi muốn 'gạch' nhiều lần như kích thước của mini-batch của tôi. Ví dụ, nếu kích thước lô nhỏ là 32 thì tôi muốn xây dựng một tensor c của kích thước (32, 5) trong đó mỗi hàng có giá trị giống với biến ban đầu (1, 5) a.hình dạng tensorflow của một tensor lát gạch

Nhưng tôi chỉ biết kích thước mini-lô tại thời gian chạy: đó là kích thước của chiều 0 của một placeholder b: tf.shape(b)[0]

Dưới đây là mã của tôi để xây dựng c:

a = tf.Variable(np.random.uniform(size=(1,5))) 
b = tf.placeholder(shape=[None, 12], dtype=tf.float32) 
batch_size = tf.shape(b)[0] 
c = tf.tile(a, tf.pack([batch_size, 1])) 

này chạy tốt . Tuy nhiên c.get_shape() trả về (?,?). Tôi không hiểu tại sao điều này không trả lại (?, 5) thay thế.

Điều này gây ra sự cố sau trong mã của tôi khi tôi tạo biến ma trận W với số cột c.get_shape()[1] mà tôi dự kiến ​​trả về 5 thay vì?

Mọi trợ giúp sẽ được đánh giá cao. Cảm ơn.

+0

Phiên bản nào? Một vấn đề tương tự đã được giải quyết trong 0.10rc. Ngoài ra bạn có thể sử dụng set_shape như một workaround –

+0

Cảm ơn, set_shape thực hiện công việc. . Là phiên bản 0.8.0rc0. –

Trả lời

3

[EDIT: này đã được cố định trong một commit để TensorFlow vào ngày 10, 2016.]

Đây là hạn chế đã biết hình dạng suy luận TensorFlow của: khi multiples lập luận để tf.tile() là một giá trị tính toán (ví dụ là kết quả của tf.pack() ở đây), và giá trị của nó không thể tính được ở thời gian xây dựng đồ thị (trong trường hợp này, vì nó phụ thuộc vào tf.placeholder(), không có giá trị cho đến khi nó được nạp), suy luận hình dạng hiện tại sẽ ném tay lên và tuyên bố rằng hình dạng không xác định (nhưng có cùng thứ hạng như đầu vào, a).

Cách giải quyết hiện tại là sử dụng Tensor.set_shape(), cho phép bạn làm lập trình viên cung cấp thông tin hình dạng bổ sung khi bạn biết nhiều hơn suy luận hình dạng. Ví dụ, bạn có thể làm:

a = tf.Variable(np.random.uniform(size=(1, 5))) 
b = tf.placeholder(shape=[None, 12], dtype=tf.float32) 
batch_size = tf.shape(b)[0] 
c = tf.tile(a, tf.pack([batch_size, 1])) 
c.set_shape([None, a.get_shape()[1]]) # or `c.set_shape([None, 5])` 

Tuy nhiên, gần đây chúng tôi đã thêm một số tính năng mà làm cho nó có thể để tuyên truyền các giá trị một phần tính toán có thể được sử dụng như hình dạng, và điều này có thể được điều chỉnh để hỗ trợ chức năng hình cho tf.tile(). Tôi đã tạo một GitHub issue để theo dõi điều này và tôi có bản sửa lỗi đang được kiểm tra ngay bây giờ.

+0

Công việc xung quanh thực hiện công việc. Rất cám ơn, đặc biệt là giải thích chi tiết. –

+0

Lưu ý rằng 'gói' đã được thay thế bằng' chồng' –

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