如何将Tensorflow数据集转换为Numpy数组?

时间:2020-06-18 16:52:48

标签: python arrays numpy tensorflow

我对Tensorflow数据集感兴趣,但是我想使用numpy对其进行操作。可以将这个PrefetchDataset变成一个数组吗?

import tensorflow_datasets as tfds
import numpy as np

dataset = tfds.load('mnist')

1 个答案:

答案 0 :(得分:0)

由于未指定splitas_supervised,因此tfds将返回设置了traintest的字典。由于as_supervised默认为False,因此imagelabel在字典中也将分开。它将是这样的:

{'test': <PrefetchDataset shapes: {image: (28, 28, 1), label: ()}, 
    types: {image: tf.uint8, label: tf.int64}>,
 'train': <PrefetchDataset shapes: {image: (28, 28, 1), label: ()}, 
    types: {image: tf.uint8, label: tf.int64}>}

因此,这是将其转换为numpy数组的方法:

import tensorflow_datasets as tfds
import numpy as np

dataset = tfds.load('mnist')

train, test = dataset['train'], dataset['test']

train_numpy = np.vstack(tfds.as_numpy(test))
test_numpy = np.vstack(tfds.as_numpy(test))

X_train = np.array(list(map(lambda x: x[0]['image'], train_numpy)))
y_train = np.array(list(map(lambda x: x[0]['label'], train_numpy)))

X_test = np.array(list(map(lambda x: x[0]['image'], test_numpy)))
y_test = np.array(list(map(lambda x: x[0]['label'], test_numpy)))

您可能想要设置as_supervised=True,它将返回tuple而不是imagelabel的字典。

[<PrefetchDataset shapes: ((28, 28, 1), ()), types: (tf.uint8, tf.int64)>]

在这种情况下,您将需要使用[0]之类的索引来选择“图像”和“标签”。因此,这是将其转换为numpy数组的方法:

import tensorflow_datasets as tfds
import numpy as np

dataset = tfds.load('mnist', split=['test'], as_supervised=True)

array = np.vstack(tfds.as_numpy(dataset[0]))

X_train = np.array(list(map(lambda x: x[0], array)))
y_train = np.array(list(map(lambda x: x[1], array)))

证明:

X_train.shape
(10000, 28, 28, 1)