使用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的设计模式编程入门指南
Apr 02 Python
总结Python中逻辑运算符的使用
May 13 Python
各个系统下的Python解释器相关安装方法
Oct 12 Python
基于python实现在excel中读取与生成随机数写入excel中
Jan 04 Python
Python实现按照指定要求逆序输出一个数字的方法
Apr 19 Python
Linux系统(CentOS)下python2.7.10安装
Sep 26 Python
python创建学生成绩管理系统
Nov 22 Python
python中有关时间日期格式转换问题
Dec 25 Python
python实现人脸签到系统
Apr 13 Python
Python迭代器协议及for循环工作机制详解
Jul 14 Python
Django实现文章详情页面跳转代码实例
Sep 16 Python
Python Pandas pandas.read_sql函数实例用法
Jun 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邮件群发机实现代码
2016/02/16 PHP
php中类和对象:静态属性、静态方法
2017/04/09 PHP
PHP SESSION机制的理解与实例
2019/03/22 PHP
Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
2019/10/11 PHP
javascript读取xml
2006/11/04 Javascript
JavaScript 保存数组到Cookie的代码
2010/04/14 Javascript
js 设置选中行的样式的实现代码
2010/05/24 Javascript
js定时调用方法成功后并停止调用示例
2014/04/08 Javascript
JavaScript中的this关键字使用详解
2015/08/14 Javascript
jQuery实现右侧显示可向左滑动展示的深色QQ客服效果代码
2015/10/23 Javascript
js实现div模拟模态对话框展现URL内容
2016/05/27 Javascript
javascript闭包概念简单解析(推荐)
2016/06/03 Javascript
NODE.JS跨域问题的完美解决方案
2016/10/20 Javascript
基于vue实现swipe分页组件实例
2017/05/25 Javascript
Vue axios全局拦截 get请求、post请求、配置请求的实例代码
2018/11/28 Javascript
JavaScript实现邮箱后缀提示功能的示例代码
2018/12/13 Javascript
Webpack4 使用Babel处理ES6语法的方法示例
2019/03/07 Javascript
vue的三种图片引入方式代码实例
2019/11/19 Javascript
bootstrap实现嵌套模态框的实例代码
2020/01/10 Javascript
nodejs实现百度舆情接口应用示例
2020/02/07 NodeJs
linux系统使用python监测网络接口获取网络的输入输出
2014/01/15 Python
Python程序中用csv模块来操作csv文件的基本使用教程
2016/03/03 Python
Python对list列表结构中的值进行去重的方法总结
2016/05/07 Python
Python实现Linux中的du命令
2017/06/12 Python
解决tensorflow1.x版本加载saver.restore目录报错的问题
2018/07/26 Python
tf.concat中axis的含义与使用详解
2020/02/07 Python
python实现单张图像拼接与批量图片拼接
2020/03/23 Python
CSS3线性渐变简单实现以及该属性在浏览器中的不同
2012/12/12 HTML / CSS
纯css3无js实现的Android Logo(有简单动画)
2013/01/21 HTML / CSS
优秀英语专业毕业生求职信
2013/11/23 职场文书
单位门卫岗位职责
2013/12/20 职场文书
厉行勤俭节约倡议书
2014/05/16 职场文书
党员服务承诺书
2014/05/28 职场文书
舞蹈教育学专业求职信
2014/06/29 职场文书
九年级数学教学反思
2016/02/17 职场文书
教你使用一行Python代码玩遍童年的小游戏
2021/08/23 Python