Keras PREDICTION throws 'TypeError: ufunc 'add'не содержит цикл с типами соответствия сигнатуры dtype(' <U4 ') dtype(' <U4 ') dtype(' <U4 ')'
Я построил модель заполнения слотов (тип классификации последовательностей) со структурой: пользовательский слой встраивания ELMo - BiLSTM - CRF.
Тренируется нормально. Но по прогнозу я получаю:
'TypeError: ufunc 'add' did not contain a loop with signature matching types dtype('<U4') dtype('<U4') dtype('<U4')'.
Примечание: U4 является неподписанным int.
В аналогичной проблеме здесь было указано, что "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 ответ
Обновление, я нашел решение: я был неправ, чтобы преобразовать наборы y в np.str, например
y_train = np.array(y_train, dtype=np.str)
Мне нужно преобразовать наборы Y в массивы, но добавив dtype=np.str
чтобы эта линия была просто недосмотром.
Я надеюсь, что мои часы боли принесут пользу другим!:)