Keras PREDICTION throws 'TypeError: ufunc' add 'не содержал цикл с типами соответствия сигнатуры dtype (' <U4 ') dtype (' <U4 ') dtype (' <U4 ')' - PullRequest
1 голос
/ 10 июля 2019

Я построил модель заполнения слотов (тип классификации последовательностей) со структурой: пользовательский слой вложений ELMo - BiLSTM - CRF.

Тренируется нормально. Но по прогнозу я получаю:

'TypeError: ufunc 'add' did not contain a loop with signature matching types dtype('<U4') dtype('<U4') dtype('<U4')'.

Примечание: U4 - это целое число без знака.

В аналогичная проблема здесь , было рекомендовано, чтобы "test_data должен быть того же типа данных, что и тип (training_data [0]), при использовании предиката, и он вернет тип данных типа (training_labels [0"). ])». Я подтвердил, что да, каждый из моих тестовых образцов того же типа, что и training_data [0].

Полное сообщение об ошибке в конце этого поста.

Примечание: проблема может быть связана с тем фактом, что ранее мне нужно было изменить мои данные поезда и теста на np.strings, используя:

X_train_sents = np.array(X_train_sents, dtype=np.str)
y_train_sents = np.array(y_train_sents, dtype=np.str)

Это было сделано для того, чтобы избежать ошибки при построении модели, а именно: str не имеет атрибута ndim. Я получаю эту ошибку снова, если я не преобразую данные теста в np.str.

Коллега считает, что проблема заключается в методе добавления (см. Ошибку) где-то глубоко в Керасе. По-видимому, это специальный метод add для работы с неподписанными целочисленными значениями, он не должен вызывать таких проблем, как сейчас.

Пользовательский слой свободно основан на хранилище этого человека

Воспроизвести ошибку: я установил github-репозиторий с кодом и некоторыми фиктивными данными здесь

Полная ошибка:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-15-f71c3fcdc6d2> in <module>
     16 print(type(X_train_sents[0]))
     17 print(type(X_test_sents[0]))
---> 18 test_pred = model.predict(X_test_sents, y_test)

~/.conda/envs/base_munroke/lib/python3.7/site-packages/keras/engine/training.py in predict(self, x, batch_size, verbose, steps)
   1167                                             batch_size=batch_size,
   1168                                             verbose=verbose,
-> 1169                                             steps=steps)
   1170 
   1171     def train_on_batch(self, x, y,

~/.conda/envs/base_munroke/lib/python3.7/site-packages/keras/engine/training_arrays.py in predict_loop(model, f, ins, batch_size, verbose, steps)
    280         # Sample-based predictions.
    281         outs = []
--> 282         batches = make_batches(num_samples, batch_size)
    283         index_array = np.arange(num_samples)
    284         for batch_index, (batch_start, batch_end) in enumerate(batches):

~/.conda/envs/base_munroke/lib/python3.7/site-packages/keras/engine/training_utils.py in make_batches(size, batch_size)
    367         A list of tuples of array indices.
    368     """
--> 369     num_batches = (size + batch_size - 1) // batch_size  # round up
    370     return [(i * batch_size, min(size, (i + 1) * batch_size))
    371             for i in range(num_batches)]

TypeError: ufunc 'add' did not contain a loop with signature matching types dtype('<U4') dtype('<U4') dtype('<U4')

1 Ответ

0 голосов
/ 10 июля 2019

Обновление, я нашел решение: я был не прав, преобразовав наборы y в np.str, например

y_train = np.array(y_train, dtype=np.str)

Мне нужно преобразовать наборы y в массивы, но добавление dtype=np.str к этой строке было просто недосмотром.

Я надеюсь, что мои часы боли принесут пользу другим! :)

...