我在NLP LSTM命名的实体提取模型工作,但遇到不同的错误,下面是关于错误的更多细节。我在jupiter笔记本中运行此代码
Tensorflow版本2.9
输入和输出的长度均为50
输入语句:[123 88 170 221 132 52 105 32 211 91 126 211 24 221 134 154 221 162 215 80 144 101 61 136 68 133 40 200 133 40 218 131 139 199 124 74 184 92 213二百二十一二百二十一二百二十一二百二十一二百二十一二百二十一二百二十一二百二十一二百二十一
输出语句标签:[77770762751777777777777777777777777777777777]
最多添加5个层来训练模型
模型如下:
model = tf.keras.Sequential([
tf.keras.layers.Embedding(num_words, 50, input_length=50),
tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(64, return_sequences=True)),
tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(32)),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(64, activation=‘relu’),
tf.keras.layers.Dense(num_tags, activation=‘softmax’)
])
**如果我使用损失函数作为“categorical_crossentropy”,我得到这个错误:**ValueError:形状(无,50)和(无,11)不兼容
如果我使用损失函数作为“sparse_categorical_crossentropy”,我得到这个错误:对数和标签必须具有相同的第一个维度,已获取对数形状[13,11]和标签形状[650] [[{节点稀疏分类交叉熵/稀疏软最大交叉熵与对数/稀疏软最大交叉熵与对数}}]
我尝试添加输入形状作为第一层,但仍然没有运气tf.keras.layers.Input(shape=(max_len,))
有没有人能帮上忙,怎么解决这个问题。尝试了不同的方法,但没有运气
这是型号摘要
Layer (type) Output Shape Param #
=================================================================
embedding_18 (Embedding) (None, 50, 50) 11100
bidirectional_35 (Bidirecti (None, 50, 128) 58880
onal)
bidirectional_36 (Bidirecti (None, 64) 41216
onal)
dropout_17 (Dropout) (None, 64) 0
dense_35 (Dense) (None, 64) 4160
dense_36 (Dense) (None, 11) 715
=================================================================
Total params: 116,071
Trainable params: 116,071
Non-trainable params: 0
_________________________________________________________________
1条答案
按热度按时间njthzxwz1#
我认为你在最后2个密集层中有一个问题。当运行一个50个数字的序列时,你会得到“num_tags”数字作为输出(11)。
但是你想在序列的每一步得到'num_tags'输出,而不是在最后。要实现这一点,你可以使用TimeDistributed层:
然后你可以使用“sparse_categorical_crossentropy”损失函数,因为你的标签是整型的。
请参见示例:https://towardsdatascience.com/named-entity-recognition-ner-using-keras-bidirectional-lstm-28cd3f301f54