使用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中pip更新和三方插件安装说明
Jul 08 Python
Python实现的网页截图功能【PyQt4与selenium组件】
Jul 12 Python
Anaconda2 5.2.0安装使用图文教程
Sep 19 Python
python实现二维插值的三维显示
Dec 17 Python
详解Python3定时器任务代码
Sep 23 Python
python3 pillow模块实现简单验证码
Oct 31 Python
python numpy 矩阵堆叠实例
Jan 17 Python
tensorflow 实现打印pb模型的所有节点
Jan 23 Python
解决python ThreadPoolExecutor 线程池中的异常捕获问题
Apr 08 Python
Python如何实现机器人聊天
Sep 10 Python
一文搞懂python异常处理、模块与包
Jun 26 Python
Django实现WebSocket在线聊天室功能(channels库)
Sep 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的MySQL连接类
2013/06/07 PHP
zf框架的数据库追踪器使用示例
2014/03/13 PHP
Windows和Linux中php代码调试工具Xdebug的安装与配置详解
2014/05/08 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
2015/07/31 PHP
jQuery Ajax 实例全解析
2011/04/20 Javascript
javascript高级学习笔记整理
2011/08/14 Javascript
使用javascript:将其它类型值转换成布尔类型值的解决方法详解
2013/05/07 Javascript
Knockout text绑定DOM的使用方法
2013/11/15 Javascript
关于JS中match() 和 exec() 返回值和属性的测试
2016/03/21 Javascript
JavaScript每天必学之基础知识
2016/09/17 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
2016/09/18 Javascript
Jquery Easyui选项卡组件Tab使用详解(10)
2016/12/18 Javascript
Vue.js实战之利用vue-router实现跳转页面
2017/04/01 Javascript
基于JavaScript实现百度搜索框效果
2020/06/28 Javascript
vue-router路由与页面间导航实例解析
2017/11/07 Javascript
浅谈vue-router2路由参数注意的问题
2017/11/08 Javascript
跨域解决之JSONP和CORS的详细介绍
2018/11/21 Javascript
js的继承方法小结(prototype、call、apply)(推荐)
2019/04/17 Javascript
深入理解令牌认证机制(token)
2019/08/22 Javascript
Python实用技巧之列表、字典、集合中根据条件筛选数据详解
2018/07/11 Python
python实现桌面托盘气泡提示
2019/07/29 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
2019/10/28 Python
Pytorch技巧:DataLoader的collate_fn参数使用详解
2020/01/08 Python
详解html5 postMessage解决跨域通信的问题
2018/08/17 HTML / CSS
One.com挪威:北欧成长最快的网络托管公司
2016/11/19 全球购物
德国的大型美妆个护电商:Flaconi
2020/06/26 全球购物
生物专业个人自荐信范文
2013/11/29 职场文书
企业办公室主任岗位职责
2014/02/19 职场文书
揭牌仪式主持词
2014/03/19 职场文书
物业管理委托协议(2篇)
2014/09/23 职场文书
国际政治学专业推荐信
2014/09/26 职场文书
教师个人考察材料
2014/12/16 职场文书
自主招生专家推荐信
2015/03/26 职场文书
2016情人节宣传语
2015/07/14 职场文书
MongoDB数据库部署环境准备及使用介绍
2022/03/21 MongoDB
Spring JPA 增加字段执行异常问题及解决
2022/06/10 Java/Android