使用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日期操作学习笔记
Oct 07 Python
Python 面向对象 成员的访问约束
Dec 23 Python
Python实现的tab文件操作类分享
Nov 20 Python
使用Python对IP进行转换的一些操作技巧小结
Nov 09 Python
Django使用Mysql数据库已经存在的数据表方法
May 27 Python
Python分割指定页数的pdf文件方法
Oct 26 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
Oct 30 Python
Python实现不规则图形填充的思路
Feb 02 Python
在python中利用pycharm自定义代码块教程(三步搞定)
Apr 15 Python
如何使用python记录室友的抖音在线时间
Jun 29 Python
基于python+selenium自动健康打卡的实现代码
Jan 13 Python
Python用requests库爬取返回为空的解决办法
Feb 21 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中的正则表达式函数介绍
2012/02/27 PHP
基于PHP magic_quotes_gpc的使用方法详解
2013/06/24 PHP
php+ajax无刷新上传图片实例代码
2015/11/17 PHP
微信利用PHP创建自定义菜单的方法
2016/08/01 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
javascript call方法使用说明
2010/01/11 Javascript
JavaScript Event学习第九章 鼠标事件
2010/02/08 Javascript
基于jquery实现状态限定编辑的代码
2012/02/11 Javascript
javascript学习笔记(十七) 检测浏览器插件代码
2012/06/20 Javascript
js获取input标签的输入值实现代码
2013/08/05 Javascript
javascript组合使用构造函数模式和原型模式实例
2015/06/04 Javascript
学习使用bootstrap3栅格系统
2016/04/12 Javascript
基于Bootstrap和jQuery构建前端分页工具实例代码
2016/11/23 Javascript
javascript实现简单的ajax封装示例
2016/12/28 Javascript
bootstrap组件之按钮式下拉菜单小结
2017/01/19 Javascript
AngularJS常见过滤器用法实例总结
2017/07/06 Javascript
jQuery列表检索功能实现代码
2017/07/17 jQuery
新版vue-cli模板下本地开发环境使用node服务器跨域的方法
2018/04/03 Javascript
[42:32]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
Python中使用第三方库xlutils来追加写入Excel文件示例
2015/04/05 Python
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
Django学习教程之静态文件的调用详解
2018/05/08 Python
Python制作微信好友背景墙教程(附完整代码)
2019/07/17 Python
Python进程间通信 multiProcessing Queue队列实现详解
2019/09/23 Python
使用Python实现正态分布、正态分布采样
2019/11/20 Python
Pycharm github配置实现过程图解
2020/10/13 Python
Pytest测试框架基本使用方法详解
2020/11/25 Python
柒牌官方商城:中国男装优秀品牌
2017/06/30 全球购物
英国电子专家:maplin
2019/09/04 全球购物
什么是动态端口(Dynamic Ports)?动态端口的范围是多少?
2014/12/12 面试题
linux面试题参考答案(9)
2016/01/29 面试题
银行个人求职自荐信范文
2013/12/16 职场文书
2014个人年度工作总结范文
2014/12/24 职场文书
医者仁心观后感
2015/06/17 职场文书
2016中秋晚会开幕词
2016/03/03 职场文书
使用 Apache Dubbo 实现远程通信(微服务架构)
2022/02/12 Servers