keras LSTM命名实体识别模型-形状不兼容或logit/标签具有不同的维度- Tensorflow 2.9

b5lpy0ml  于 2023-01-17  发布在  Git
关注(0)|答案(1)|浏览(169)

我在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
_________________________________________________________________
njthzxwz

njthzxwz1#

我认为你在最后2个密集层中有一个问题。当运行一个50个数字的序列时,你会得到“num_tags”数字作为输出(11)。
但是你想在序列的每一步得到'num_tags'输出,而不是在最后。要实现这一点,你可以使用TimeDistributed层:

tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(64, activation=‘relu’)),
tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(num_tags, activation=‘softmax’))

然后你可以使用“sparse_categorical_crossentropy”损失函数,因为你的标签是整型的。
请参见示例:https://towardsdatascience.com/named-entity-recognition-ner-using-keras-bidirectional-lstm-28cd3f301f54

相关问题