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

问题描述 投票:0回答:13

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

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

我的问题是如何以 numpy 形式从 TF 数据集中获取数据/标签?换句话说,想要的是上面一行的反向操作,即我有一个 TF 数据集,并且想要从中获取图像和标签。

tensorflow tensorflow-datasets
13个回答
83
投票

如果您的

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

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

快速解释:

[y for x, y in ds]
在Python中被称为“列表理解”。如果数据集是批处理的,则此表达式将循环遍历每个批次,并将每个批次 y(TF 1D 张量)放入列表中,然后返回它。然后,np.concatenate 将获取此一维张量列表(隐式转换为 numpy)并将其堆叠在 0 轴上以生成单个长向量。总而言之,它只是将一堆一维小向量转换为一个长向量。

注意:如果你的 y 更复杂,这个答案将需要一些小的修改。


26
投票

假设我们的 tf.data.Dataset 名为

train_dataset
,并且
eager_execution
打开(TF 2.x 中默认),您可以像这样检索图像和标签:

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 数组
  • 如果您想检索数据集的更多元素,只需增加 take 方法中的数字即可。如果您想要所有元素,只需插入
    -1

12
投票

如果您同意将图像和标签保留为

tf.Tensor
,您可以这样做

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

将数据集的效果视为

zip(images, labels)
。当我们想要取回图像和标签时,我们可以简单地unzip它。

如果您需要 numpy 数组版本,请使用

np.array()
:

进行转换
images = np.array(images)
labels = np.array(labels)

8
投票

我认为我们在这里得到了一个很好的例子:

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)

返回一个 dict(),其中键为 ['article', 'highlight'],其中包含 numpy 字符串。


6
投票

您可以使用 TF Dataset 方法 unbatch() 取消数据集的批处理,然后您可以轻松地从中检索数据和标签:

ds_labels=[]
for images, labels in ds.unbatch():
    ds_labels.append(labels) # or labels.numpy().argmax() for int labels

或者一行:

ds_labels = [labels for _, labels in ds.unbatch()]

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

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


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)

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}

0
投票

TensorFlow 的

get_single_element()
最终是 around,可用于从数据集中提取数据和标签。

这避免了使用
.map()
iter()
生成和使用迭代器的需要(这对于大数据集可能成本高昂)。

get_single_element()
返回封装数据集所有成员的张量(或张量的元组或字典)。我们需要将批处理的数据集的所有成员传递到单个元素中。

这可用于获取作为张量数组的特征,或作为元组或字典(张量数组)的特征和标签,具体取决于原始数据集的创建方式。

查看 SO 上的这个 answer,了解将特征和标签解压到张量数组元组中的示例。


0
投票

https://www.tensorflow.org/tutorials/images/classification

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 10))
for images, labels in train_ds.take(1):
  for i in range(9):
  ax = plt.subplot(3, 3, i + 1)
  plt.imshow(images[i].numpy().astype("uint8"))
  plt.title(class_names[labels[i]])
  plt.axis("off")

0
投票

您可以使用地图功能。

https://www.tensorflow.org/api_docs/python/tf/data/Dataset#map

images = dataset.map(lambda images, labels: images)
labels = dataset.map(lambda images, labels: labels)

0
投票

对我有用的解决方案(截至目前尚未报告):

假设我有一个名为“dataset”的数据集。

要迭代数据集中的批次:

dataset.as_numpy_iterator()

获取数据集中所有批次的列表:

list(dataset.as_numpy_iterator())

获取数据集中的第一批(作为列表[数据,标签]):

list(dataset.as_numpy_iterator())[0]

要从数据集中的第一批中获取“标签”:

list(dataset.as_numpy_iterator())[0][1]

等等..


0
投票

对于tensorflow = 2.12.0和文本数据集

加载数据集

(ds_train, ds_test), ds_info = tfds.load('imdb_reviews', with_info=True, 
split=['train', 'test'], data_dir="your_dir\\tensorflow_datasets\\")

提取数据和标签

for i, dict in enumerate(ds_train.take(5)):
    print(ds_info.features['label'].int2str(dict["label"].numpy()))
    print(dict["text"].numpy())
© www.soinside.com 2019 - 2024. All rights reserved.