1 問題描述
在建立NER識別模型時出現:
TypeError: Tensors in list passed to 'values' of 'ConcatV2' Op have types [bool, float32] that don't all match.
2 分析問題
我們仔細看報錯語句,可以看到真正報錯的語句爲:return tf.concat([to_dense(x) for x in tensors], axis)
我們找到這行代碼:
進行斷點調試:
可以看到確實存在兩個tensor的值類型不一致。
回過頭再來看報錯的語句:
TypeError: Tensors in list passed to 'values' of 'ConcatV2' Op have types [bool, float32] that don't all match.
這句話的意思是:傳給concatV2操作的values值有兩種類型,一直是bool類型,一種是float32類型。
從實際代碼來看就是下面這一句:
但是上面兩個tensor值是哪裏傳過來的呢?
經過調試,發現是從mask傳過來的值:
bool類型的值是mask,float32類型的值是zeros_like的返回值。
3 解決問題
於是我們將建立模型時的參數:
model.add(Embedding(len(self.vocab), self.Embedding_dim, mask_zero=True))
改爲:
model.add(Embedding(len(self.vocab), self.Embedding_dim, mask_zero=False))
於是,代碼可以正常運行了:
4 問題總結
(1) 需要認真看每一條報錯信息對應代碼;
(2) 打斷點調試到報錯的語句,查看相應的數據值;
(3) 懷疑是原始數據的問題導致,mask_zero不能設置爲True,有待進一步分析。