如何从TensorFlow数据集中提取数据/标签

时间:2019-05-20 18:53:19

标签: tensorflow tensorflow-datasets

有很多示例如何创建和使用TensorFlow数据集,例如

dataset = tf.data.Dataset.from_tensor_slices((images, labels))

我的问题是如何从numpy格式的TF数据集中取回数据/标签?换句话说,want将是上面一行的反向操作,即我有一个TF数据集,并希望从中获取图像和标签。

7 个答案:

答案 0 :(得分:5)

如果您的tf.data.Dataset已批量处理,则以下代码将检索所有y标签:

y = np.concatenate([y for x, y in ds], axis=0)

答案 1 :(得分:2)

假设我们的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()转换numpy数组中的tf.tensor
  • 如果要检索数据集的更多元素,只需增加take方法内的数量。如果需要所有元素,只需插入-1

答案 2 :(得分:1)

这对我有用

features = np.array([list(x[0].numpy()) for x in list(ds_test)])
labels = np.array([x[1].numpy() for x in list(ds_test)])



# NOTE: ds_test was created
iris, iris_info = tfds.load('iris', with_info=True)
ds_orig = iris['train']
ds_orig = ds_orig.shuffle(150, reshuffle_each_iteration=False)
ds_train = ds_orig.take(100)
ds_test = ds_orig.skip(100)

答案 3 :(得分:0)

我认为我们在这里有一个很好的例子:

https://colab.research.google.com/github/tensorflow/datasets/blob/master/docs/overview.ipynb#scrollTo=BC4pEXtkp4K-

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']且内部带有numpy字符串的dict()。

答案 4 :(得分:0)

这是我自己解决问题的方法:

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

请注意,此函数将产生数据集批处理的输入/标签。这些步骤控制将从数据集中取出多少批次。

答案 5 :(得分:0)

如果您可以将图像和标签保留为 tf.Tensor,则可以这样做

images, labels = tuple(zip(*dataset))

将数据集的效果想象为 zip(images, labels)。当我们想要取回图像和标签时,我们可以简单地unzip

如果您需要 numpy 数组版本,请使用 np.array() 进行转换:

images = np.array(images)
labels = np.array(labels)

答案 6 :(得分:0)

import numpy as np
import tensorflow as tf

batched_features = tf.constant([[[1, 3], [2, 3]],
                                [[2, 1], [1, 2]],
                                [[3, 3], [3, 2]]], shape=(3, 2, 2))
batched_labels = tf.constant([[0, 0],
                              [1, 1],
                              [0, 1]], shape=(3, 2, 1))
dataset = tf.data.Dataset.from_tensor_slices((batched_features, batched_labels))
classes = np.concatenate([y for x, y in dataset], axis=0)
unique = np.unique(classes, return_counts=True)
labels_dict = dict(zip(unique[0], unique[1]))
print(classes)
print(labels_dict)
# {0: 3, 1: 3}