Доступ к данным в Tenorflow PrefetchDataset - PullRequest
0 голосов
/ 17 июня 2020

Я все еще изучаю tenorflow и keras, и подозреваю, что на этот вопрос есть очень простой ответ, который мне просто не хватает из-за незнания.

У меня есть объект PrefetchDataset:

> print(tf_test)
$ <PrefetchDataset shapes: ((None, 99), (None,)), types: (tf.float32, tf.int64)>

... состоит из характеристик и цели. Я могу перебрать его, используя for l oop:

> for example in tf_test:
>     print(example[0].numpy())
>     print(example[1].numpy())
>     exit()
$ [[-0.31 -0.94 -1.12 ... 0.18 -0.27]
   [-0.22 -0.54 -0.14 ... 0.33 -0.55]
   [-0.60 -0.02 -1.41 ... 0.21 -0.63]
   ...
   [-0.03 -0.91 -0.12 ... 0.77 -0.23]
   [-0.76 -1.48 -0.15 ... 0.38 -0.35]
   [-0.55 -0.08 -0.69 ... 0.44 -0.36]]
  [0 0 1 0 1 0 0 0 1 0 1 1 0 1 0 0 0
   ...
   0 1 1 0]

Однако это очень медленно. Что я хотел бы сделать, так это получить доступ к тензору, соответствующему меткам классов, и превратить его в массив numpy, или список, или любой итерируемый объект, который можно передать в отчет о классификации scikit-learn и / или матрицу путаницы :

> y_pred = model.predict(tf_test)
> print(y_pred)
$ [[0.01]
   [0.14]
   [0.00]
   ...
   [0.32]
   [0.03]
   [0.00]]
> y_pred_list = [int(x[0]) for x in y_pred]             # assumes value >= 0.5 is positive prediction
> y_true = []                                           # what I need help with
> print(sklearn.metrics.confusion_matrix(y_true, y_pred_list)

... ИЛИ получить доступ к данным, чтобы их можно было использовать в матрице путаницы тензорного потока:

> labels = []                                           # what I need help with
> predictions = y_pred_list                             # could we just use a tensor?
> print(tf.math.confusion_matrix(labels, predictions)

В обоих случаях общая возможность захвата целевых данных из исходный объект, не требующий больших вычислительных затрат, был бы очень полезен (и мог бы помочь с моими базовыми интуициями re: tensorflow и keras).

Любой совет будет очень признателен.

Edit: Николас прекрасно замечает, что мой вопрос невозможно воспроизвести. Я буду использовать набор данных mnist для решения этой проблемы:

> dataset = tfds.load('mnist')
> test = dataset['test'].prefetch(1)

Я могу перебирать набор данных, используя for l oop (или понимание списка, как показано:

> y_test = [x['label'].numpy() for x in test]

... но я ищу более быстрый способ (в котором я могу получить прямой доступ к данным. Например, в model.evaluate() доступ к X и y осуществляется, но это не займет больше времени, чем model.predict(), для которого доступны только данные X. Означает ли это, что есть способ получить доступ к целевым данным без всех вычислительных затрат на итерацию?

Здесь дан ответ Николаса:

> test_numpy = np.vstack(tfds.as_numpy(test))
> y_test = np.array(list(map(lambda x: x[0]['label'], test_numpy)))

Это не быстрее, чем то, что я уже опубликовал. Как я сказал в комментарии, если это, в конечном счете, проблема того, что я не понимаю подходящие функции или структуры данных, и нет более быстрого способа, это абсолютно приемлемо ответ. Я надеюсь (возможно, наивно), что это не так.

Ответы [ 2 ]

1 голос
/ 31 июля 2020

Вы можете преобразовать его в список с помощью list(ds), а затем перекомпилировать его как обычный набор данных с помощью tf.data.Dataset.from_tensor_slices(list(ds)). С этого момента ваш кошмар начинается снова, но, по крайней мере, это кошмар, который был у других людей раньше.

Обратите внимание, что для более сложных наборов данных (например, вложенных словарей) вам потребуется дополнительная предварительная обработка после вызова list(ds), но это должно работает для примера, о котором вы спрашивали.

Это далеко не удовлетворительный ответ, но, к сожалению, класс полностью недокументирован, и ни один из стандартных приемов набора данных не работает.

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

Некоторые части вашего сообщения кажутся мне расплывчатыми, поэтому мой ответ соответствует этой части:

Я бы хотел получить доступ к тензору, соответствующему меткам классов и превратите это в numpy массив , или список, или любую итерацию, которую можно передать в отчет о классификации scikit-learn и / или матрицу путаницы

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

Вы будете теперь есть <PrefetchDataset> как массив numpy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...