«ValueError: установка элемента массива с последовательностью.» при вызове tf.keras.utils.to_categorical тензора TensorFlow - PullRequest
1 голос
/ 03 апреля 2019

Когда я запускаю следующий код:

import numpy as np
import tensorflow as tf

arr = np.array([2., 4., 5., 9.])
tf.keras.utils.to_categorical(arr, 10)

все идет хорошо, и вывод:

array([[0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]], dtype=float32)

Но если я заменю arr на tf.constant(arr) (или я думаю, но без определенности любого Тензорного), как в следующем коде:

tf.keras.utils.to_categorical(tf.constant(arr), 10)

Я получаю следующую ошибку:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-139-507d6ce7c0a3> in <module>()
----> 1 tf.keras.utils.to_categorical(tf.constant(arr), 10)

.../miniconda2/lib/python2.7/site-packages/tensorflow/python/keras/utils/np_utils.pyc in to_categorical(y, num_classes, dtype)
     38       last.
     39   """
---> 40   y = np.array(y, dtype='int')
     41   input_shape = y.shape
     42   if input_shape and input_shape[-1] == 1 and len(input_shape) > 1:

ValueError: setting an array element with a sequence.

Конфигурация:

  • Python: 2,7
  • Тензор потока: 1.13.1
  • Керас (внутри Tensorflow): 2.2.4-tf
  • ОС: Ubuntu 16.04

Как я мог избавиться / обойти эту проблему?

Немного контекста:

Моя главная проблема, когда я звоню model.compile со следующей потерей:

def loss(y_true, y_pred):
    # Cross entropy loss
    bin_true = y_true[:, 0]
    print bin_true.eval()

    dum = tf.keras.utils.to_categorical(bin_true, 66)
    cls_loss = tf.keras.losses.categorical_crossentropy(dum, y_pred, True)

    # MSE loss
    cont_true = y_true[:, 1]
    pred_cont = tf.keras.backend.sum(tf.nn.softmax(y_pred) * idx_tensor, 1) * 3 - 99
    mse_loss = tf.keras.losses.mean_squared_error(cont_true, pred_cont)

    # Total loss
    return cls_loss + 0.5 * mse_loss

Я получаю точно такую ​​же ошибку в строке dum = tf.keras.utils.to_categorical(bin_true, 66))

(я даю некоторый контекст, потому что весь мой «способ сделать» может быть неправильным ...)

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Наивным ответом на ваш вопрос является использование get_value(x), как в

bin_true_array = tf.keras.backend.get_value(bin_true)
dum = tf.keras.utils.to_categorical(bin_true_array, 66)
....

, при этом значение bin_true будет извлечено в виде массива numpy, а затем передано вNumpy утилита utils.to_categorical.Вот ваш пример (скорректированный):

import numpy as np
import tensorflow as tf

arr = np.array([2., 4., 5., 9.])
tf.keras.utils.to_categorical(arr, 10)

tensor = tf.constant(arr)
tensor_as_array = tf.keras.backend.get_value(tensor)
tf.keras.utils.to_categorical(tensor_as_array, 10)

Проблема с этим подходом состоит в том, что вы выходите из бэкэнда, возвращаетесь в python и numpy (который поставляется со всеми вкусностями python, такими как GIL), а затемтолкать вещи обратно в бэкэнд.Это может (или не может) создать узкое место в вашем конвейере.В этом случае зависимое от бэкенда решение, такое как предложенное @Robin Beilvert, могло бы помочь вам лучше.

1 голос
/ 03 апреля 2019

Вы можете попробовать использовать tf.one_hot вместо keras to_categorical

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