2017-11-14 28 views
6

tôi có chức năng sau:Tương đương với mã sau trong chuỗi lưu lượng là gì?

import random 

lst = [] 
for i in range(100): 
    lst.append(random.randint(1, 10)) 

print(lst) 

buffer = [] 

# This is the peace of code which I am interested to convert into tensorflow. 
for a in lst: 
    buffer.append(a) 

    if len(buffer) > 5: 
     buffer.pop(0) 

    if len(buffer) == 5: 
     print(buffer) 

Vì vậy, từ mã, tôi cần phải tạo ra một bộ đệm (có thể là một biến trong tensorflow). Bộ đệm này sẽ giữ các tính năng được trích xuất từ ​​conv layer vừa qua. variable sẽ là đầu vào cho số RNN trong trường hợp của tôi.

Ưu điểm của cách tiếp cận này là khi chúng tôi có hình ảnh lớn và khi chúng tôi cần nạp một RNN với (batch of images) * (sequence length) * (size of 1 image), sẽ yêu cầu một lượng lớn hình ảnh được tải vào bộ nhớ chính. Mặt khác, theo đoạn mã trên, chúng tôi sẽ cho ăn 1 hình ảnh cùng một lúc bằng cách sử dụng Datasets từ lưu lượng, hoặc input queue hoặc bất kỳ phương án thay thế nào khác. Kết quả là, chúng ta sẽ được lưu trữ trong bộ nhớ tính năng kích thước: batch_size * sequence_length * feature space .Tại Thêm vào đó, chúng ta có thể nói:

if len(buffer) == n: 
    # empty out the buffer after using its elements 
    buffer = [] # Or any other alternative way 

Tôi biết rằng tôi có thể ăn mạng của tôi batches các hình ảnh, nhưng tôi cần phải hoàn thành mã được đề cập dựa trên một số tài liệu.

Bất kỳ trợ giúp nào được đánh giá cao !!

+0

bạn có thể sử dụng tf.FIFOQueue không? https://www.tensorflow.org/api_docs/python/tf/FIFOQueue – greeness

Trả lời

2

tôi cố gắng tái tạo đầu ra bằng cách sử dụng tf.FIFOQueue (https://www.tensorflow.org/api_docs/python/tf/FIFOQueue). Tôi đã đưa ra mã của tôi dưới đây với các ý kiến ​​khi cần thiết.

BATCH_SIZE = 20 

lst = [] 
for i in range(BATCH_SIZE): 
    lst.append(random.randint(1, 10)) 
print(lst) 

curr_data = np.reshape(lst, (BATCH_SIZE, 1)) # reshape the tensor so that [BATCH_SIZE 1] 

# queue starts here 
queue_input_data = tf.placeholder(tf.int32, shape=[1]) # Placeholder for feed the data 

queue = tf.FIFOQueue(capacity=50, dtypes=[tf.int32], shapes=[1]) # Queue define here 

enqueue_op = queue.enqueue([queue_input_data]) # enqueue operation 
len_op = queue.size() # chek the queue size 

#check the length of the queue and dequeue one if greater than 5 
dequeue_one = tf.cond(tf.greater(len_op, 5), lambda: queue.dequeue(), lambda: 0) 
#check the length of the queue and dequeue five elemts if equals to 5 
dequeue_many = tf.cond(tf.equal(len_op, 5), lambda:queue.dequeue_many(5), lambda: 0) 

with tf.Session() as session: 
    for i in range(BATCH_SIZE): 
     _ = session.run(enqueue_op, feed_dict={queue_input_data: curr_data[i]}) # enqueue one element each ietaration 
     len = session.run(len_op) # check the legth of the queue 
     print(len) 

     element = session.run(dequeue_one) # dequeue the first element 
     print(element) 

Tuy nhiên, sau hai vấn đề có liên quan đến mã trên,

  1. Chỉ dequeue mộtdequeue nhiều hoạt động có sẵn và bạn không thể nhìn thấy các yếu tố bên trong hàng đợi (Tôi không nghĩ rằng bạn sẽ cần điều này vì bạn đang tìm kiếm một cái gì đó giống như một đường ống ).

  2. Tôi nghĩ rằng tf.cond là cách duy nhất để thực hiện một có điều kiện hoạt động (Tôi không thể tìm thấy bất kỳ chức năng phù hợp khác tương tự như thế). Tuy nhiên, vì nó tương tự như câu lệnh if-then-else if-then-else, bắt buộc phải xác định hoạt động khi tuyên bố cũng sai (không chỉ có nếu tuyên bố mà không có else). Kể từ Tensorflow là tất cả về việc xây dựng một đồ thị, tôi nghĩ rằng nó cần thiết để bao gồm hai chi nhánh (khi điều kiện là đúng và sai).

Hơn nữa, một lời giải thích tốt cho Tensorflow đường ống đầu vào có thể được tìm thấy ở đây (http://ischlag.github.io/2016/11/07/tensorflow-input-pipeline-for-large-datasets/).

Hy vọng điều này sẽ hữu ích.

+0

Hãy cho tôi biết nếu đây không phải là những gì bạn mong đợi một cách exacly. –

+0

@Wijerathne, Không, đây không phải là những gì tôi đang tìm kiếm. Vì vậy, làm u biết làm thế nào để sử dụng (nói cách khác, sử dụng giá trị của hàng đợi tensor.size()) không thông qua sess.run (....) Có lẽ điều đó sẽ giải quyết được vấn đề. –

+0

Tôi đã cập nhật câu trả lời của mình –

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