2017-11-30 27 views
6

Tôi có danh sách dài các danh sách các số nguyên (đại diện cho các câu, mỗi một kích thước khác nhau) mà tôi muốn cấp bằng thư viện tf.data. Mỗi danh sách (của danh sách của danh sách) có độ dài khác nhau, và tôi nhận được một lỗi, mà tôi có thể tái tạo ở đây:Cách nhập danh sách các danh sách có kích thước khác nhau trong tf.data.Dataset

t = [[4,2], [3,4,5]] 
dataset = tf.data.Dataset.from_tensor_slices(t) 

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

ValueError: Argument must be a dense tensor: [[4, 2], [3, 4, 5]] - got shape [2], but wanted [2, 2]. 

Có cách nào để làm cái này?

EDIT 1: Chỉ cần rõ ràng, tôi không muốn để pad danh sách đầu vào của danh sách (đó là danh sách các câu có chứa hơn một triệu phần tử, với độ dài khác nhau) Tôi muốn sử dụng thư viện tf.data nguồn cấp dữ liệu, theo cách thích hợp, danh sách các danh sách có độ dài khác nhau.

+0

có thể sử dụng chức năng ánh xạ theo một cách nào đó? – Escachator

+0

Bản sao của [câu hỏi này] (https://stackoverflow.com/questions/40450506/convert-a-list-with-non-fixed-length-elements-to-tensor). – scrpy

+0

Chỉ cần được rõ ràng: Tôi không muốn pad tensor, tôi muốn để có thể ăn, sử dụng thư viện dữ liệu, một danh sách các danh sách với độ dài khác nhau. – Escachator

Trả lời

3

Bạn có thể sử dụng tf.data.Dataset.from_generator() để chuyển đổi bất kỳ đối tượng Python iterable (giống như một danh sách liệt kê) vào một Dataset:

t = [[4, 2], [3, 4, 5]] 

dataset = tf.data.Dataset.from_generator(lambda: t, tf.int32, output_shapes=[None]) 

iterator = dataset.make_one_shot_iterator() 
next_element = iterator.get_next() 

with tf.Session() as sess: 
    print(sess.run(next_element)) # ==> '[4, 2]' 
    print(sess.run(next_element)) # ==> '[3, 4, 5]' 
+0

Cảm ơn @mrry, âm thanh như một giải pháp tốt. – Escachator

0

Tôi không nghĩ rằng tensorflow hỗ trợ tensors với số lượng yếu tố khác nhau cùng với một thứ nguyên nhất định.

Tuy nhiên, một giải pháp đơn giản là để pad danh sách lồng nhau với đuôi số không (nếu cần thiết):

t = [[4,2], [3,4,5]] 
max_length = max(len(lst) for lst in t) 
t_pad = [lst + [0] * (max_length - len(lst)) for lst in t] 
print(t_pad) 
dataset = tf.data.Dataset.from_tensor_slices(t_pad) 
print(dataset) 

Đầu ra:

[[4, 2, 0], [3, 4, 5]] 
<TensorSliceDataset shapes: (3,), types: tf.int32> 

Các số không không phải là một vấn đề lớn đối với mô hình: ngữ nghĩa chúng chỉ là các câu phụ có kích thước bằng không ở cuối mỗi danh sách các câu thực tế.

+0

Xin chào, cảm ơn vì câu trả lời, bởi tôi không thể đệm toàn bộ danh sách các danh sách do kích thước của nó. Tôi sẽ làm padding cho mỗi lô, nhưng không phải cho toàn bộ tập dữ liệu bao gồm hàng triệu câu. – Escachator

0

Ngoài câu trả lời @ mrry của, đoạn code sau cũng có thể nếu bạn muốn tạo cặp (hình ảnh, nhãn):

import itertools 
data = tf.data.Dataset.from_generator(lambda: itertools.izip_longest(images, labels), 
             output_types=(tf.float32, tf.float32), 
             output_shapes=(tf.TensorShape([None, None, 3]), 
                tf.TensorShape([None]))) 

iterator = dataset.make_one_shot_iterator() 
next_element = iterator.get_next() 

with tf.Session() as sess: 
    image, label = sess.run(next_element) # ==> shape: [320, 420, 3], [20] 
    image, label = sess.run(next_element) # ==> shape: [1280, 720, 3], [40] 
Các vấn đề liên quan