Как превратить набор данных Tensorflow в массив Numpy? - PullRequest
1 голос
/ 18 июня 2020

Меня интересует набор данных Tensorflow, но я хочу управлять им с помощью numpy. Можно ли превратить этот PrefetchDataset в массив?

import tensorflow_datasets as tfds
import numpy as np

dataset = tfds.load('mnist')

1 Ответ

0 голосов
/ 18 июня 2020

Поскольку вы не указали split или as_supervised, tfds вернет словарь с установленными train и test. Поскольку as_supervised по умолчанию равно False, image и label также будут разделены в словаре. Вот как это будет выглядеть:

{'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 вместо словаря для image и label.

[<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)
...