不均等な形状の配列のリストの形式でデータをトークン化しました。
array([array([1179, 6, 208, 2, 1625, 92, 9, 3870, 3, 2136, 435,
5, 2453, 2180, 44, 1, 226, 166, 3, 4409, 49, 6728,
...
10, 17, 1396, 106, 8002, 7968, 111, 33, 1130, 60, 181,
7988, 7974, 7970])], dtype=object)
それぞれのターゲットで:
Out[74]: array([0, 0, 0, ..., 0, 0, 1], dtype=object)
それらをパッド付きに変換しようとしていますが、tf.data.Dataset()
等しくない形状をテンソルに変換することはできません。このエラーが発生します:
ValueError: Can't convert non-rectangular Python sequence to Tensor.
完全なコードはここにあります。私の出発点が後だと仮定しますy = ...
:
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
import tensorflow as tf
import tensorflow_datasets as tfds
import numpy as np
(train_data, test_data) = tfds.load('imdb_reviews/subwords8k',
split=(tfds.Split.TRAIN, tfds.Split.TEST),
as_supervised=True)
x = np.array(list(train_data.as_numpy_iterator()))[:, 0]
y = np.array(list(train_data.as_numpy_iterator()))[:, 1]
train_tensor = tf.data.Dataset.from_tensor_slices((x.tolist(), y))\
.padded_batch(batch_size=8, padded_shapes=([None], ()))
これをパッド付きバッチテンソルに変えるための私のオプションは何ですか?
データがNumpy配列またはPythonリストに保存されている場合は、tf.data.Dataset.from_generator
メソッドを使用してデータセットを作成し、バッチをパディングできます。
train_batches = tf.data.Dataset.from_generator(
lambda: iter(zip(x, y)),
output_types=(tf.int64, tf.int64)
).padded_batch(
batch_size=32,
padded_shapes=([None], ())
)
ただし、tensorflow_datasets.load
関数を使用as_numpy_iterator
している場合は、を使用してデータとラベルを分離し、それらをデータセットに戻す必要はありません。それは冗長で非効率的です。によって返されるオブジェクトは、tensorflow_datasets.load
すでにtf.data.Dataset
。のインスタンスです。だから、あなたpadded_batch
はそれらに使用する必要があります:
train_batches = train_data.padded_batch(batch_size=32, padded_shapes=([None], []))
test_batches = test_data.padded_batch(batch_size=32, padded_shapes=([None], []))
TensorFlow 2.2以降では、padded_shapes
すべての軸をバッチの最長にパディングするだけの場合(つまり、デフォルトの動作)、引数を指定する必要がなくなったことに注意してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加