使用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创建和使用字典实例详解
Nov 01 Python
python实现代码行数统计示例分享
Feb 10 Python
在Python中操作列表之List.append()方法的使用
May 20 Python
Python实现数据库并行读取和写入实例
Jun 09 Python
Python中常用信号signal类型实例
Jan 25 Python
python unittest实现api自动化测试
Apr 04 Python
Python 实现网页自动截图的示例讲解
May 17 Python
django drf框架中的user验证以及JWT拓展的介绍
Aug 12 Python
深入浅析Python 命令行模块 Click
Mar 11 Python
Python CSS选择器爬取京东网商品信息过程解析
Jun 01 Python
matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel())
Feb 22 Python
Python 数据可视化神器Pyecharts绘制图像练习
Feb 28 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传输数据的代码
2007/11/13 PHP
Zend的AutoLoad机制介绍
2012/09/27 PHP
php去除HTML标签实例
2013/11/06 PHP
对php 判断http还是https,以及获得当前url的方法详解
2019/01/15 PHP
jQuery+PHP实现图片上传并提交功能
2020/07/27 PHP
在标题栏显示新消息提示,很多公司项目中用到这个方法
2011/11/04 Javascript
jquery ready(fn)事件使用介绍
2013/08/21 Javascript
js将当前时间格式转换成时间搓(自写)
2013/09/26 Javascript
js实现的折叠导航示例
2013/11/29 Javascript
深入理解关于javascript中apply()和call()方法的区别
2016/04/12 Javascript
jQuery实现点击按钮文字变成input框点击保存变成文字
2016/05/09 Javascript
微信小程序 wxapp地图 map详解
2016/10/31 Javascript
JS基于for语句编写的九九乘法表示例
2018/01/04 Javascript
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
2018/02/01 Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
2018/09/14 Javascript
一些你可能不熟悉的JS知识点总结
2019/03/15 Javascript
vue点击页面空白处实现保存功能
2019/11/06 Javascript
探索Python3.4中新引入的asyncio模块
2015/04/08 Python
如何使用VSCode愉快的写Python于调试配置步骤
2018/04/06 Python
解决python字典对值(值为列表)赋值出现重复的问题
2019/01/20 Python
python爬虫神器Pyppeteer入门及使用
2019/07/13 Python
手写一个python迭代器过程详解
2019/08/27 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
2020/06/09 Python
Python如何定义有可选参数的元类
2020/07/31 Python
预订全球最佳旅行体验:Viator
2018/03/30 全球购物
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
2012/05/30 面试题
既然说Ruby中一切都是对象,那么Ruby中类也是对象吗
2013/01/26 面试题
公关关系专员的自我评价分享
2013/11/20 职场文书
小学生家长寄语
2014/04/02 职场文书
银行竞聘演讲稿
2014/05/16 职场文书
党员承诺书怎么写
2014/05/20 职场文书
品牌推广活动策划方案
2014/08/19 职场文书
工伤死亡理赔协议书
2014/10/20 职场文书
大学毕业晚会开场白
2015/05/29 职场文书
Pytorch可视化的几种实现方法
2021/06/10 Python
关于springboot 配置date字段返回时间戳的问题
2021/07/25 Java/Android