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