怎么实现BERT+LSTM+CRF模型结构?
收藏
问下,怎么实现BERT+LSTM+CRF模型结构,在项目空间里能找到BERT项目和LSTM+CRF项目,看了BERT源代码,但不知道用那个函数或类。就是把BERT作为嵌入层这块不会写,后面的LSTM+CRF没有问题。
我爱志方小姐
已解决
7#
回复于2021-08-19
`PaddleNLP` 有参考实现的代码呀。我知道的至少有两个可以参考: https://github.com/PaddlePaddle/PaddleNLP/blob/develop/examples/information_extraction/waybill_ie/model.py https://github.com/PaddlePaddle/PaddleNLP/blob/develop/paddlenlp/transformers/skep/modeling.py#L443
0
收藏
请登录后评论
初步想法是参考class BertForTokenClassification(BertPretrainedModel):写一个。
花了很长时间遍历项目库,一个类似的项目都没有,不知道为什么?
代码如下:
class BiGRUWithCRF(nn.Layer):
def __init__(self,
hidden_size = 300,#BiGRU层每个单元隐状态维度
label_num =2 #标签类型总数
):
super(BiGRUWithCRF, self).__init__()
#定义Embedding层,即关键的BERT层
self.bert = BertModel.from_pretrained("bert-base-chinese")
#定义BiGRU层:门控循环单元网络,
self.gru = nn.GRU(self.bert.config["hidden_size"],#输入词嵌入维度
hidden_size,#每个单元隐状态维度
num_layers=2,#网络层数
direction='bidirectional')#网络迭代方向
#定义全连接层:线性变换层,参数是输入层和输出层的神经元个数
#未登录词'O'不在label_vocab中,分类时存在未登陆词,所以标签个数label_num要加2
self.fc = nn.Linear(hidden_size * 2, label_num + 2) # BOS EOS
#定义CRF层:线性链式CRF,根据上下文进行序列预测
self.crf = LinearChainCrf(label_num)
#定义解码层:维特比译码器,获取评分最高的序列标签,输入参数是CRF的转移矩阵
self.decoder = ViterbiDecoder(self.crf.transitions)
训练时出现这个错误:TypeError: 'Model' object is not callable
程序跑起来了,主要修改了forward参数,使之与DataLoader返回的参数一致,也就是input_ids,seg_type,len,label
感觉论坛太冷清了,目前F1值不正常。
`PaddleNLP` 有参考实现的代码呀。我知道的至少有两个可以参考:
https://github.com/PaddlePaddle/PaddleNLP/blob/develop/examples/information_extraction/waybill_ie/model.py
https://github.com/PaddlePaddle/PaddleNLP/blob/develop/paddlenlp/transformers/skep/modeling.py#L443
我楼上的答案设为解决方案了,供参考。
3q
下面的项目用了这个模型
https://aistudio.baidu.com/aistudio/projectdetail/1584124
很好,参考了。
太赞了~