27

tf.data ライブラリを使用して供給したい整数 (それぞれ異なるサイズの文を表す) のリストの長いリストがあります。(リストのリストの) 各リストの長さは異なり、ここで再現できるエラーが発生します。

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

私が得るエラーは次のとおりです。

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

これを行う方法はありますか?

EDIT 1:明確にするために、リストの入力リストをパディングしたくありません(これは、さまざまな長さの100万を超える要素を含む文のリストです)tf.dataライブラリを使用して、適切な方法で、さまざまな長さのリストのリスト。

4

4 に答える 4

1

@mrryの回答に加えて、(画像、ラベル)ペアを作成したい場合は、次のコードも可能です:

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]
于 2017-12-31T09:09:53.407 に答える
0

テンソルフローは、特定の次元に沿ってさまざまな数の要素を持つテンソルをサポートしているとは思いません。

ただし、簡単な解決策は、ネストされたリストに末尾のゼロを埋め込むことです (必要な場合)。

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)

出力:

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

ゼロはモデルにとって大きな問題にはならないはずです。意味的には、実際の文の各リストの最後にある、サイズがゼロの余分な文です。

于 2017-12-04T12:20:47.383 に答える