使用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连接mongodb密码认证实例
Oct 16 Python
pycharm在调试python时执行其他语句的方法
Nov 29 Python
python获取url的返回信息方法
Dec 17 Python
python selenium firefox使用详解
Feb 26 Python
Python通过TensorFlow卷积神经网络实现猫狗识别
Mar 14 Python
详解python中list的使用
Mar 15 Python
解决django后台样式丢失,css资源加载失败的问题
Jun 11 Python
对Python中画图时候的线类型详解
Jul 07 Python
利用Python模拟登录pastebin.com的实现方法
Jul 12 Python
浅谈python3中input输入的使用
Aug 02 Python
python3实现用turtle模块画一棵随机樱花树
Nov 21 Python
python将数组n等分的实例
Dec 02 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版网站缓存加快打开速度的方法分享
2012/06/03 PHP
php存储过程调用实例代码
2013/02/03 PHP
PHP分页初探 一个最简单的PHP分页代码的简单实现
2016/06/21 PHP
安装docker和docker-compose实例详解
2019/07/30 PHP
PHP 实现base64编码文件上传出现问题详解
2020/09/01 PHP
jquery鼠标停止移动事件
2013/12/21 Javascript
Jquery图片延迟加载插件jquery.lazyload.js的使用方法
2014/05/21 Javascript
nodejs npm包管理的配置方法及常用命令介绍
2014/06/05 NodeJs
详解JavaScript对W3C DOM模版的支持情况
2015/06/16 Javascript
javascript跨域请求包装函数与用法示例
2016/11/03 Javascript
jQuery常见的选择器及用法介绍
2016/12/20 Javascript
微信小程序实现图片预加载组件
2017/01/18 Javascript
js实现下拉框效果(select)
2017/03/28 Javascript
Bootstrap Table从零开始
2017/06/30 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
工作中常用js功能汇总
2020/11/07 Javascript
[50:58]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 Mineski vs EG
2018/04/03 DOTA
[02:17]快乐加倍!DOTA2食人魔魔法师至宝+迎霜节活动上线
2019/12/22 DOTA
python解析json实例方法
2013/11/19 Python
关于Python中Inf与Nan的判断问题详解
2017/02/08 Python
Windows和Linux下Python输出彩色文字的方法教程
2017/05/02 Python
Python实现的线性回归算法示例【附csv文件下载】
2018/12/29 Python
Python实现批量执行同目录下的py文件方法
2019/01/11 Python
django Layui界面点击弹出对话框并请求逻辑生成分页的动态表格实例
2020/05/12 Python
Python基于Faker假数据构造库
2020/11/30 Python
伦敦新晋轻奢耳饰潮牌:Tada & Toy
2020/05/25 全球购物
数控专业大学生的自我鉴定
2013/11/13 职场文书
五年级英语教学反思
2014/01/31 职场文书
大班开学家长寄语
2014/04/04 职场文书
2015年班组工作总结
2015/04/20 职场文书
元旦主持词开场白
2015/05/29 职场文书
2016年学校综治宣传月活动总结
2016/03/16 职场文书
五年级作文之学校的四季
2019/12/05 职场文书
详解MySQL InnoDB存储引擎的内存管理
2021/04/08 MySQL
SQL IDENTITY_INSERT作用案例详解
2021/08/23 MySQL
python如何读取和存储dict()与.json格式文件
2022/06/25 Python