tensorFlowデータセットを作成して使用する方法の例はたくさんあります。
dataset = tf.data.Dataset.from_tensor_slices((images, labels))
私の質問は、TFデータセットからデータ/ラベルを派手な形式で取得する方法ですか?言い換えると、上の行の逆の操作が必要になります。つまり、TFデータセットがあり、そこから画像とラベルを取得したいのです。
Tf.data.Datasetが_train_dataset
_と呼ばれ、_eager_execution
_がオンの場合、次のように画像とラベルを取得できます。
_for images, labels in train_dataset.take(1): # only take first element of dataset
numpy_images = images.numpy()
numpy_labels = labels.numpy()
_
.numpy()
はtf.Tensorsをnumpy配列に変換します-1
_を挿入するだけですここに問題に対する私の独自の解決策があります:
def dataset2numpy(dataset, steps=1):
"Helper function to get data/labels back from TF dataset"
iterator = dataset.make_one_shot_iterator()
next_val = iterator.get_next()
with tf.Session() as sess:
for _ in range(steps):
inputs, labels = sess.run(next_val)
yield inputs, labels
この関数はデータセットバッチの入力/ラベルを生成することに注意してください。ステップは、データセットから取り出されるバッチの数を制御します。
ここに良い例があると思います:
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
import tensorflow_datasets as tfds
# where mnsit train is a tf dataset
mnist_train = tfds.load(name="mnist", split=tfds.Split.TRAIN)
assert isinstance(mnist_train, tf.data.Dataset)
mnist_example, = mnist_train.take(1)
image, label = mnist_example["image"], mnist_example["label"]
plt.imshow(image.numpy()[:, :, 0].astype(np.float32), cmap=plt.get_cmap("gray"))
print("Label: %d" % label.numpy())
したがって、データセットの個々のコンポーネントには、辞書のようにアクセスできます。おそらく異なるデータセットには異なるフィールド名があります(ボストンの住宅には画像と値はありませんが、「機能」と「ターゲット」または「価格」がある場合があります:
cnn = tfds.load(name="cnn_dailymail", split=tfds.Split.TRAIN)
assert isinstance(cnn, tf.data.Dataset)
cnn_ex, = cnn.take(1)
print(cnn_ex)
内部に派手な文字列を持つキー['article'、 'highlight']を持つdict()を返します。