2017-11-24 59 views
6

Tôi muốn đào tạo một mạng có các đường cong phẳng, mà tôi biểu diễn dưới dạng mảng numpy với hình dạng (L,2). Số 2 là viết tắt của x, y tọa độ và L là số điểm đang thay đổi trong tập dữ liệu của tôi. Tôi coi x, y là 2 "kênh" khác nhau.Làm thế nào để nạp dữ liệu vào với kích thước thay đổi trong Tensorflow

Tôi đã thực hiện một hàm, next_batch(batch_size), cung cấp lô tiếp theo dưới dạng mảng khối u 1D có hình dạng (batch_size,), chứa các phần tử là mảng 2D có hình dạng: (L,2). Đây là những đường cong của tôi, và như đã đề cập trước đây, L là khác nhau giữa các yếu tố. (Tôi không muốn giam giữ số điểm cố định trong đường cong).

Câu hỏi của tôi:

Làm thế nào tôi có thể thao tác các đầu ra từ next_batch() vì vậy tôi sẽ có thể để nuôi mạng với các đường cong đầu vào, sử dụng một chương trình tương tự với những gì xuất hiện trong Tensorflow hướng dẫn: https://www.tensorflow.org/get_started/mnist/pros

tức là, sử dụng cơ chế feed_dict. Trong trao turorial kích thước đầu vào đã được cố định, phù mã của hướng dẫn:

train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5}) 

batch[0] có hình dạng cố định: (50,784) (50 = # mẫu, 784 = #pixels)

tôi không thể thay đổi của tôi nhập vào mảng numpy với hình dạng (batch_size,L,2) vì mảng phải có kích thước cố định trong mọi kích thước. Vì vậy, tôi có thể làm gì?

tôi đã được xác định một placeholder (có thể có kích thước chưa biết):

#first dimension is the sample dim, second is curve length, third:x,y coordinates  
x = tf.placeholder(tf.float32, [None, None,2]) 

nhưng làm thế nào tôi có thể ăn nó đúng cách?

Cảm ơn bạn rất nhiều

+0

Có phải đệm đầu vào là giải pháp khả thi không? –

+0

không may là không, trong bài toán của tôi –

+0

@Day_Dreamer bạn phải dán nó để sử dụng theo đợt. Làm cách nào để tạo một trình giữ chỗ có độ dài? – Maxim

Trả lời

1

ngắn mà có lẽ bạn đang tìm kiếm, bạn có thể không phải không có đệm hoặc nhóm mẫu bởi chiều dài.

Để xây dựng một chút: trong chuỗi lưu lượng, kích thước phải được cố định trong suốt một lô và các mảng răng cưa không được hỗ trợ nguyên bản.
Kích thước có thể biết một tiên nghiệm (trong trường hợp này bạn thiết lập kích thước của placeholders để None) nhưng vẫn suy ra khi chạy, vì vậy giải pháp của bạn có một placeholder:

x = tf.placeholder(tf.float32, [None, None, 2]) 

không thể làm việc vì nó ngữ nghĩa tương đương với câu nói "Tôi không biết các hằng số hằng số độ dài của các đường cong trong một lô một ưu tiên, suy ra nó khi chạy từ dữ liệu".Điều này không có nghĩa là mô hình của bạn nói chung không thể chấp nhận đầu vào của các thứ nguyên khác nhau, nếu bạn cấu trúc nó cho phù hợp, nhưng dữ liệu mà bạn nạp nó mỗi khi bạn gọi sess.run() phải có kích thước cố định.

lựa chọn của bạn, sau đó, như sau:

  1. Pad lô của bạn dọc theo chiều hướng thứ hai.
    Nói rằng bạn có 2 đường cong của hình dạng (4, 2)(5, 2) và bạn biết chiều dài đường cong tối đa trong bạn DataSet là 6, bạn có thể sử dụng np.pad như sau:

    In [1]: max_len = 6 
        ...: curve1 = np.random.rand(4, 2) 
        ...: curve2 = np.random.rand(5, 2) 
        ...: batch = [curve1, curve2] 
    
    In [2]: for b in batch: 
        ...:  dim_difference = max_len - b.shape[0] 
        ...:  print np.pad(b, [(0, dim_difference), (0,0)], 'constant') 
        ...:  
    [[ 0.92870128 0.12910409] 
    [ 0.41894655 0.59203704] 
    [ 0.3007023 0.52024492] 
    [ 0.47086336 0.72839691] 
    [ 0.   0.  ] 
    [ 0.   0.  ]] 
    [[ 0.71349902 0.0967278 ] 
    [ 0.5429274 0.19889411] 
    [ 0.69114597 0.28624011] 
    [ 0.43886002 0.54228625] 
    [ 0.46894651 0.92786989] 
    [ 0.   0.  ]] 
    
  2. Có bạn lô trở lại next_batch() chức năng của đường cong phân nhóm theo chiều dài.

Đây là những cách tiêu chuẩn để thực hiện mọi thứ khi xử lý các mảng bị lởm chởm.

Một khả năng khác, nếu nhiệm vụ của bạn cho phép, là nối tất cả các điểm của bạn trong một hình dạng đơn (None, 2) và thay đổi mô hình của bạn để hoạt động trên các điểm đơn như thể chúng là mẫu trong một mẻ. Nếu bạn lưu độ dài mẫu gốc trong một mảng riêng biệt, thì bạn có thể khôi phục lại các kết quả đầu ra của mô hình bằng cách cắt chúng một cách chính xác. Điều này là rất không hiệu quả và đòi hỏi tất cả các loại giả định về vấn đề của bạn, nhưng đó là một khả năng.

Chúc mừng và chúc bạn may mắn!

5

Bạn có thể sử dụng đầu vào có kích thước khác nhau trong TF. chỉ cần nạp dữ liệu theo cách tương tự như trong hướng dẫn bạn liệt kê, nhưng hãy đảm bảo xác định các thứ nguyên thay đổi trong trình giữ chỗ là Không.

Dưới đây là một ví dụ đơn giản ăn một placeholder với hình dạng khác nhau: câu trả lời

import tensorflow as tf 
import numpy as np 


array1 = np.arange(9).reshape((3,3)) 
array2 = np.arange(16).reshape((4,4)) 
array3 = np.arange(25).reshape((5,5)) 

model_input = tf.placeholder(dtype='float32', shape=[None, None]) 
sqrt_result = tf.sqrt(model_input) 
with tf.Session() as sess: 
    print sess.run(sqrt_result, feed_dict={model_input:array1}) 
    print sess.run(sqrt_result, feed_dict={model_input:array2}) 
    print sess.run(sqrt_result, feed_dict={model_input:array3}) 
0

Tensorflow Fold có thể bạn quan tâm.

Từ Tensorflow README Fold:

TensorFlow Fold là một thư viện để tạo mô hình TensorFlow rằng tiêu thụ dữ liệu có cấu trúc, nơi cấu trúc của đồ thị tính toán phụ thuộc vào cấu trúc của data.Fold đầu vào thực hiện theo tỹ lệ động . Các lô đồ thị tính toán có hình dạng tùy ý được chuyển đổi để tạo ra một đồ thị tính toán tĩnh. Biểu đồ này có cấu trúc giống nhau bất kể đầu vào nào nhận được và có thể được thực hiện hiệu quả bởi TensorFlow.

Cấu trúc đồ thị có thể được thiết lập để chấp nhận một giá trị tùy ý L để cho bất kỳ đầu vào có cấu trúc có thể được đọc. Điều này đặc biệt hữu ích khi xây dựng kiến ​​trúc như lưới thần kinh đệ quy. Cấu trúc tổng thể là rất giống với những gì bạn đang sử dụng để (feed dicts, vv). Vì bạn cần một biểu đồ tính toán động cho ứng dụng của bạn, đây có thể là một động thái tốt cho bạn trong thời gian dài.

1

Bạn có thể sử dụng trình giữ chỗ có ký hiệu var ban đầu với [None, ..., None]. Mỗi 'Không' có nghĩa là có dữ liệu nguồn cấp dữ liệu đầu vào ở kích thước đó cho trình biên dịch. Ví dụ, [None, None] có nghĩa là một ma trận với bất kỳ độ dài hàng và cột nào bạn có thể nạp. Tuy nhiên, bạn nên cẩn thận về loại NN nào bạn sử dụng. Bởi vì khi bạn đối phó với CNN, ở tầng chập và lớp hồ bơi, bạn phải xác định kích thước cụ thể của 'tensor'.

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