使用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中的闭包
Aug 11 Python
使用Python的Django框架结合jQuery实现AJAX购物车页面
Apr 11 Python
利用Python自动监控网站并发送邮件告警的方法
Aug 24 Python
python 类对象和实例对象动态添加方法(分享)
Dec 31 Python
在Python中pandas.DataFrame重置索引名称的实例
Nov 06 Python
Python反爬虫技术之防止IP地址被封杀的讲解
Jan 09 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
Jul 01 Python
详解python statistics模块及函数用法
Oct 27 Python
python如果快速判断数字奇数偶数
Nov 13 Python
python随机模块random使用方法详解
Feb 14 Python
python 图像插值 最近邻、双线性、双三次实例
Jul 05 Python
Python使用内置函数setattr设置对象的属性值
Oct 16 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
中英文字符串翻转函数
2008/12/09 PHP
提高PHP编程效率的53个要点(经验小结)
2010/09/04 PHP
PHP和.net中des加解密的实现方法
2013/02/27 PHP
php 批量生成html,txt文件的实现代码
2013/06/26 PHP
php内嵌函数用法实例
2015/03/20 PHP
php set_include_path函数设置 include_path 配置选项
2016/10/30 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
ThinkPHP框架使用redirect实现页面重定向的方法实例分析
2018/04/12 PHP
PHP+iframe模拟Ajax上传文件功能示例
2019/07/02 PHP
Bootstrap教程JS插件滚动监听学习笔记分享
2016/05/18 Javascript
详解Python中logging日志模块在多进程环境下的使用
2016/12/26 Javascript
原生JS京东轮播图代码
2017/03/22 Javascript
详解ES6之用let声明变量以及let loop机制
2017/07/15 Javascript
jQuery实现全选、反选和不选功能
2017/08/16 jQuery
Vue实例中生命周期created和mounted的区别详解
2017/08/25 Javascript
解决Vue打包之后文件路径出错的问题
2018/03/06 Javascript
详解vue表单——小白速看
2018/04/08 Javascript
vue+element导航栏高亮显示的解决方式
2019/11/12 Javascript
jQuery开发仿QQ版音乐播放器
2020/07/10 jQuery
Python的批量远程管理和部署工具Fabric用法实例
2015/01/23 Python
Python中用于去除空格的三个函数的使用小结
2015/04/07 Python
用Python计算三角函数之acos()方法的使用
2015/05/15 Python
python itchat实现微信好友头像拼接图的示例代码
2017/08/14 Python
Python实现的HMacMD5加密算法示例
2018/04/03 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
2020/02/10 Python
pycharm通过anaconda安装pyqt5的教程
2020/03/24 Python
python db类用法说明
2020/07/07 Python
Python 制作查询商品历史价格的小工具
2020/10/20 Python
pandas将list数据拆分成行或列的实现
2020/12/13 Python
消防安全宣传口号
2014/06/10 职场文书
分公司总经理岗位职责
2014/08/03 职场文书
个人授权委托书格式
2014/08/30 职场文书
店铺转让协议书(2014版)
2014/09/23 职场文书
个人授权委托书范本格式
2014/10/12 职场文书
信访维稳承诺书
2015/05/04 职场文书
2015年林业工作总结
2015/05/14 职场文书