使用keras实现BiLSTM+CNN+CRF文字标记NER


Posted in Python onJune 29, 2020

我就废话不多说了,大家还是直接看代码吧~

import keras
from sklearn.model_selection import train_test_split
import tensorflow as tf
from keras.callbacks import ModelCheckpoint,Callback
# import keras.backend as K
from keras.layers import *
from keras.models import Model
from keras.optimizers import SGD, RMSprop, Adagrad,Adam
from keras.models import *
from keras.metrics import *
from keras import backend as K
from keras.regularizers import *
from keras.metrics import categorical_accuracy
# from keras.regularizers import activity_l1 #通过L1正则项,使得输出更加稀疏
from keras_contrib.layers import CRF

from visual_callbacks import AccLossPlotter
plotter = AccLossPlotter(graphs=['acc', 'loss'], save_graph=True, save_graph_path=sys.path[0])

# from crf import CRFLayer,create_custom_objects

class LossHistory(Callback):
  def on_train_begin(self, logs={}):
    self.losses = []

  def on_batch_end(self, batch, logs={}):
    self.losses.append(logs.get('loss'))
# def on_epoch_end(self, epoch, logs=None):

word_input = Input(shape=(max_len,), dtype='int32', name='word_input')
word_emb = Embedding(len(char_value_dict)+2, output_dim=64, input_length=max_len, dropout=0.2, name='word_emb')(word_input)
bilstm = Bidirectional(LSTM(32, dropout_W=0.1, dropout_U=0.1, return_sequences=True))(word_emb)
bilstm_d = Dropout(0.1)(bilstm)
half_window_size = 2
paddinglayer = ZeroPadding1D(padding=half_window_size)(word_emb)
conv = Conv1D(nb_filter=50, filter_length=(2 * half_window_size + 1), border_mode='valid')(paddinglayer)
conv_d = Dropout(0.1)(conv)
dense_conv = TimeDistributed(Dense(50))(conv_d)
rnn_cnn_merge = merge([bilstm_d, dense_conv], mode='concat', concat_axis=2)
dense = TimeDistributed(Dense(class_label_count))(rnn_cnn_merge)
crf = CRF(class_label_count, sparse_target=False)
crf_output = crf(dense)
model = Model(input=[word_input], output=[crf_output])
model.compile(loss=crf.loss_function, optimizer='adam', metrics=[crf.accuracy])
model.summary()

# serialize model to JSON
model_json = model.to_json()
with open("model.json", "w") as json_file:
  json_file.write(model_json)

#编译模型
# model.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['acc',])

# 用于保存验证集误差最小的参数,当验证集误差减少时,立马保存下来
checkpointer = ModelCheckpoint(filepath="bilstm_1102_k205_tf130.w", verbose=0, save_best_only=True, save_weights_only=True) #save_weights_only=True
history = LossHistory()

history = model.fit(x_train, y_train,
          batch_size=32, epochs=500,#validation_data = ([x_test, seq_lens_test], y_test),
          callbacks=[checkpointer, history, plotter],
          verbose=1,
          validation_split=0.1,
          )

补充知识:keras训练模型使用自定义CTC损失函数,重载模型时报错解决办法

使用keras训练模型,用到了ctc损失函数,需要自定义损失函数如下:

self.ctc_model.compile(loss={'ctc': lambda y_true, output: output}, optimizer=opt)

其中loss为自定义函数,使用字典{‘ctc': lambda y_true, output: output}

训练完模型后需要重载模型,如下:

from keras.models import load_model

model=load_model('final_ctc_model.h5')

报错:

Unknown loss function : <lambda>

由于是自定义的损失函数需要加参数custom_objects,这里需要定义字典{'': lambda y_true, output: output},正确代码如下:

model=load_model('final_ctc_model.h5',custom_objects={'<lambda>': lambda y_true, output: output})

可能是因为要将自己定义的loss函数加入到keras函数里

在这之前试了很多次,如果用lambda y_true, output: output定义loss

函数字典名只能是'<lambda>',不能是别的字符

如果自定义一个函数如loss_func作为loss函数如:

self.ctc_model.compile(loss=loss_func, optimizer=opt)

可以在重载时使用

am=load_model('final_ctc_model.h5',custom_objects={'loss_func': loss_func})

此时注意字典名和函数名要相同

以上这篇使用keras实现BiLSTM+CNN+CRF文字标记NER就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中的魔法方法深入理解
Jul 09 Python
Python转换HTML到Text纯文本的方法
Jan 15 Python
python使用wxpython开发简单记事本的方法
May 20 Python
python动态网页批量爬取
Feb 14 Python
python如何派生内置不可变类型并修改实例化行为
Mar 21 Python
django 修改server端口号的方法
May 14 Python
Python根据成绩分析系统浅析
Feb 11 Python
python调用外部程序的实操步骤
Mar 04 Python
Python 获取指定文件夹下的目录和文件的实现
Aug 30 Python
python利用Excel读取和存储测试数据完成接口自动化教程
Apr 30 Python
什么是python的自省
Jun 21 Python
通过实例解析python subprocess模块原理及用法
Oct 10 Python
Python建造者模式案例运行原理解析
Jun 29 #Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
Jun 29 #Python
Python根据指定文件生成XML的方法
Jun 29 #Python
keras在构建LSTM模型时对变长序列的处理操作
Jun 29 #Python
Python爬虫爬取博客实现可视化过程解析
Jun 29 #Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
Jun 29 #Python
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
Jun 29 #Python
You might like
php将access数据库转换到mysql数据库的方法
2014/12/24 PHP
PHP实现的增强性mhash函数
2015/05/27 PHP
php实现smarty模板无限极分类的方法
2015/12/07 PHP
PHP聚合式迭代器接口IteratorAggregate用法分析
2017/12/28 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
2019/10/10 PHP
初学Javascript的一些总结
2008/11/03 Javascript
[Web]防止用户复制页面内容和另存页面的方法
2009/02/06 Javascript
JavaScript isPrototypeOf和hasOwnProperty使用区别
2010/03/04 Javascript
jquery中选择块并改变属性值的方法
2013/07/31 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
Javascript基于AJAX回调函数传递参数实例分析
2015/12/15 Javascript
Node.js 文件夹目录结构创建实例代码
2016/07/08 Javascript
全面理解闭包机制
2016/07/11 Javascript
省市二级联动小案例讲解
2016/07/24 Javascript
websocket+node.js实现实时聊天系统问题咨询
2017/05/17 Javascript
vue滚动固定顶部及修改样式的实例代码
2019/05/30 Javascript
jquery分页优化操作实例分析
2019/08/23 jQuery
Vue 实现点击空白处隐藏某节点的三种方式(指令、普通、遮罩)
2019/10/23 Javascript
9种方法优化jQuery代码详解
2020/02/04 jQuery
Python设计模式之观察者模式简单示例
2018/01/10 Python
在PyCharm下使用 ipython 交互式编程的方法
2019/01/17 Python
Python3中_(下划线)和__(双下划线)的用途和区别
2019/04/26 Python
python使用MQTT给硬件传输图片的实现方法
2019/05/05 Python
python 实现二维列表转置
2019/12/02 Python
根据tensor的名字获取变量的值方式
2020/01/04 Python
pycharm新建Vue项目的方法步骤(图文)
2020/03/04 Python
浅谈css3中的前缀
2016/07/20 HTML / CSS
英国领先的男装设计师服装独立零售商:Repertoire Fashion
2020/10/19 全球购物
2013年大学生的自我鉴定
2013/10/24 职场文书
医学生自荐信范文
2013/12/03 职场文书
事业单位个人总结
2015/02/12 职场文书
2019求职信:应届生求职信范文
2019/04/24 职场文书
编写python程序的90条建议
2021/04/14 Python
pytorch 预训练模型读取修改相关参数的填坑问题
2021/06/05 Python
MySQL 百万级数据的4种查询优化方式
2021/06/07 MySQL
HTML页面点击按钮关闭页面的多种方式
2022/12/24 HTML / CSS