Keras PREDICTION引发'TypeError:ufunc'add'不包含签名匹配类型为dtype('<U4')dtype('<U4')dtype('<U4')'

时间:2019-07-10 09:32:41

标签: python keras elmo

我建立了一个具有以下结构的插槽填充(一种序列分类)模型:自定义ELMo嵌入层-BiLSTM-CRF。

它训练得很好。但根据预测,我得到:

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

注意:U4是一个无符号整数。

a similar issue here中,建议“使用预测时,test_data应与type(training_data [0])相同,并且将返回type(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,则会再次出现此错误。

一位同事认为,问题是在Keras某处的添加方法(请参见错误)。显然,这是与无符号整数一起使用的一种特殊的添加方法,它不应引起类似的问题。

自定义层大致基于this person's repository

要重现该错误:我已经使用代码和一些伪数据here

建立了一个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 :(得分:0)

更新后,我找到了解决方案:将y集转换为np.str是错误的,例如

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

我确实需要将y集转换为数组,但是将dtype=np.str添加到该行只是一个疏忽。

我希望我的辛苦时光能对其他人有所帮助! :)