使用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实现dict版图遍历示例
Feb 19 Python
Python判断变量是否为Json格式的字符串示例
May 03 Python
python+numpy+matplotalib实现梯度下降法
Aug 31 Python
用python实现刷点击率的示例代码
Feb 21 Python
Python 存储字符串时节省空间的方法
Apr 23 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
Jun 13 Python
python 判断三个数字中的最大值实例代码
Jul 24 Python
Python编写一个验证码图片数据标注GUI程序附源码
Dec 09 Python
Python自动化测试中yaml文件读取操作
Aug 20 Python
python 提取html文本的方法
May 20 Python
Python标准库之typing的用法(类型标注)
Jun 02 Python
聊聊基于pytorch实现Resnet对本地数据集的训练问题
Mar 25 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 中英文语言转换类
2011/09/07 PHP
PHP匿名函数和use子句用法实例
2016/03/16 PHP
ThinkPHP中create()方法自动验证实例
2017/04/26 PHP
PHP通过文件保存和更新信息的方法分析
2019/09/12 PHP
Centos7.7 64位利用本地完整安装包安装lnmp/lamp套件教程
2021/03/09 Servers
Prototype使用指南之array.js
2007/01/10 Javascript
关于javascript document.createDocumentFragment()
2009/04/04 Javascript
理解Javascript_09_Function与Object
2010/10/16 Javascript
自动最大化窗口的Javascript代码
2013/05/22 Javascript
Javascript基础教程之比较操作符
2015/01/18 Javascript
JavaScript返回当前会话cookie全部键值对照的方法
2015/04/03 Javascript
Bootstrap开关(switch)控件学习笔记分享
2016/05/30 Javascript
浅谈bootstrap使用中的一些问题以及解决过程
2016/10/18 Javascript
Vue.js父与子组件之间传参示例
2017/02/28 Javascript
vue.js语法及常用指令
2017/10/29 Javascript
jQuery实现判断上传图片类型和大小的方法示例
2018/04/11 jQuery
angularJs在多个控制器中共享服务数据的方法
2018/09/30 Javascript
nodejs中方法和模块用法示例
2018/12/24 NodeJs
vue+element UI实现树形表格带复选框的示例代码
2019/04/16 Javascript
微信小程序如何使用云开发
2019/05/17 Javascript
解决vue-cli 打包后自定义动画未执行的问题
2019/11/12 Javascript
[01:38]2018DOTA2亚洲邀请赛主赛事第二日现场采访 神秘商人痛陈生计不易
2018/04/05 DOTA
简单介绍Python中的RSS处理
2015/04/13 Python
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
2016/06/07 Python
Django内容增加富文本功能的实例
2017/10/17 Python
mac安装pytorch及系统的numpy更新方法
2018/07/26 Python
Flask核心机制之上下文源码剖析
2018/12/25 Python
python实现把两个二维array叠加成三维array示例
2019/11/29 Python
pandas分组聚合详解
2020/04/10 Python
python小白切忌乱用表达式
2020/05/29 Python
IT工程师岗位职责
2014/07/04 职场文书
2015年“七七卢沟桥事变”纪念活动总结
2015/03/24 职场文书
2017寒假社会实践心得体会范文
2016/01/14 职场文书
《鲁滨逊漂流记》之六读后感(4篇)
2019/09/29 职场文书
Vue中Object.assign清空数据报错的解决方案
2022/03/03 Vue.js
如何创建一个创建MySQL数据库中的datetime类型
2022/03/21 MySQL