2016-01-22 20 views
6

Tôi đã thiết lập một CNN trong Tensorflow, nơi tôi đọc dữ liệu của mình bằng TFRecordReader. Nó hoạt động tốt nhưng tôi muốn làm một số tiền xử lý trước và tăng cường dữ liệu hơn được cung cấp bởi các hàm tf.image. Tôi đặc biệt muốn làm một số quy mô ngẫu nhiên.Preprocess một tensor Floworflow trong Numpy

Có thể xử lý tensor Tensorflow trong Numpy không? Hoặc tôi có cần phải loại bỏ TFRecordReader và thay vì thực hiện tất cả tiền xử lý của tôi trong Numpy và cung cấp dữ liệu bằng cách sử dụng feed_dict? Tôi nghi ngờ rằng phương thức feed_dict chậm khi đào tạo về hình ảnh, nhưng tôi có thể sai?

+0

'feed_dict' và' py_func' sao chép dữ liệu giữa TF và thời gian chạy Python bằng cách sử dụng đơn luồng 'memcpy', vì vậy bạn có thể nhận được tốc độ truyền 2GB/s mà không phải là nút cổ chai cho tập dữ liệu như ImageNet. Sự chậm chạp có nhiều khả năng xảy ra trong giai đoạn tiền xử lý tùy chỉnh –

Trả lời

11

Nếu bạn có thể tạo đường dẫn I/O tùy chỉnh tìm nạp kết quả trung gian từ TensorFlow bằng một hoặc nhiều luồng, áp dụng logic Python tùy ý, sau đó nạp chúng vào hàng đợi để xử lý tiếp theo. Chương trình kết quả sẽ phức tạp hơn một chút, nhưng tôi khuyên bạn nên xem threading and queues HOWTO để biết thông tin về cách bắt đầu.


Có một nghiệm tính năng mà có thể làm cho dễ dàng hơn này, nếu bạn install from source.

Nếu bạn đã xây dựng một đường ống tiền xử lý bằng cách sử dụng các biến TensorFlow, cách dễ nhất để thêm mã Python tùy chỉnh là sử dụng toán tử tf.py_func(), có danh sách các đối tượng Tensor và hàm Python ánh xạ một hoặc nhiều NumPy mảng cho một hoặc nhiều mảng NumPy.

Ví dụ, giả sử bạn có một đường ống như thế này:

reader = tf.TFRecordReader(...) 
image_t = tf.image.decode_png(tf.parse_single_example(reader.read(), ...)) 

... bạn có thể sử dụng tf.py_func() áp dụng một số chế biến NumPy tùy chỉnh như sau:

from scipy import ndimage 
def preprocess(array): 
    # `array` is a NumPy array containing. 
    return ndimage.rotate(array, 45) 

image_t = tf.py_func(preprocess, [image_t], [tf.float32]) 
+0

Cảm ơn! Chỉ dành cho những người đọc khác: để có thể thực hiện xử lý thêm, ví dụ thông qua 'tf.train.shuffle_batch', tôi phải định hình lại kết quả của' tf.py_func', điều này có ý nghĩa. – burk

+0

Hmm, hiện tại tôi đang gặp sự cố khi trích xuất kết quả của hàm. Tôi gọi nó là 'n1, n2, n3 = tf.py_func (get_triplet, [orig_tensor, truth_tensor], [tf.float32, tf.float32, tf.float32])' và tôi đã kiểm tra xem nó có nhập hàm hay không, và nó trả về 3 mảng float32 NumPy, tuy nhiên tôi nhận được lỗi 'tensorflow/python/lib/core/py_func.cc: 299] Unimplemented: không được hỗ trợ numpy type 17' trước khi' tf.py_func' kết thúc. Bất kỳ ý tưởng? – burk

+0

Vâng, tôi nghĩ rằng tôi đã tìm ra nó, tôi cần trả về '[n1, n2, n3]' từ hàm Python của tôi. – burk

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