基于Keras实现翻译系统/聊天机器人Seq2Seq模型+attention(代码篇1-LSTM模型实现)智能对话系统专辑《二》
导读部分
对话系统最核心的部分是什么,seq2seq,现在tensorflow已经提供seq2seq封装的调用方法,相对方便,但是理解seq2seq内部原理,自己动手写的话是对模型设计思路的梳理,加深对原设计的理解。长期来说,有益。
那么seq2seq里面最核心的部分呢,编码和解码过程都是用LSTM网络结构来完成的。所以上篇咱们剖析了对话系统seq2seq+attention的内部原理(聊天机器人专辑《一》),从本篇开始,《智能客服聊天机器人专辑二代码篇》正式开始了。打算分为三个核心部分,循序渐进:
1.理解seq2seq编码过程,核心用到的网络结构LSTM,手把手搭建LSTM模型,代码实战。
2.完成咱们第一部分LSTM的网络搭建后,下面我们可以更递进进入两个LSTM的搭建,也就是完整的seq2seq模型了。为什么会用到两个LSTM呢,复习下《聊天机器人专辑一》聊天机器人Seq2Seq模型+attention(理论篇-图文详解)的原理部分就知道,seq2seq是编码和解码两个过程组合的,编码用到一个LSTM,解码用到一个LSTM网络。所以跟着完成第一部分,第二部分完整的seq2seq也可以打牢基础,更理解深刻地写出来seq2seq完整的网络了。
3.Transformer代码部分的实现。主要是实现咱们专辑一的注意力机制,把翻译的语句捋顺,润滑,避免颠倒次序,譬如‘我在编程‘翻译成’’‘编程在我’。当然这一块已经业内用BERT+LSTM+Transformer了。所以考虑要不要衍生4出来。(BERT完美解决文本词向量特征这块)
好,咱们《聊天机器人专辑二》之2.1篇 ——核心网络LSTM实战搭建开始。
《聊天机器人专辑二——seq2seq核心网络模型LSTM搭建》
LSTM的搭建包含三个核心点:
1.文本数据预处理,另外为了灌入网络模型LSTM,将原有的文本数据按照LSTM输入数据规格来组合,注意LSTM要求输入三维的数据。必须将之前的预处理的文本按照LSTM input_shape的要求,进行reshape或者Embedding 起来。(这一部分本文略过,中文文本数据预处理之前的博文里已经贴出代码讲过案例,请自行点蓝色标题对照复习补全,穿越到本博客AI工匠:
《文本分类NLP豆瓣电影短评中文文本分类实战代码Jieba+sklearn》
2完成预处理后,开始基于Keras搭建网络模型LSTM (本文重点)
3.基于Keras如何自动调整学习率,找到最优模型参数组合。(本文代码包含)
以上就是本文的数据流处理过程,简单理解1准备食材,洗的洗,摘的摘,切好放盘里——2烧菜流程模拟一遍,先小火热油,大火爆炒,小火慢炖收汁——3调节盐糖鸡精等调味品的参素,组合做出最美味的佳肴。
准备食材,文本预处理过程包含1去除停用词,2去除非中文字符,3分词,4词向量化表示。
至于2和3烧菜和调味这两部分,本文重点围绕LSTM模型构建的关键点,以实例代码说明。也是上一篇智能聊天机器人对话系统中编译模型LSTM的核心实现部分。
下面直接上代码:
import os import keras import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.model_selection import GridSearchCV from sklearn.metrics import accuracy_score from keras.models import Model from keras.layers import Dense, LSTM from keras.layers import Dropout,Activation from keras.models import Sequential from keras.utils import to_categorical import utils def main(): df=utils.prepare_data() train_data,test_data=train_test_split(df,test_size=0.25,random_state=0) #特征工程 train_X,test_X,lib_a,lib_b=utils.do_feature_engineering(train_data,test_data) print(train_X.shape) print(test_X.shape) print('tfidf.vocabulary:') print({k:lib_a[k] for k in list(lib_a.keys())[0:100]}) print('count.vocabulary:') print({k:lib_b[k] for k in list(lib_b.keys())[0:100]}) #标签处理 train_y=np.array(train_data['label'].values) train_y=to_categorical(train_y) test_y=np.array(test_data['label'].values) test_y=to_categorical(test_y) #LSTM输入数据格式转换 train_X = np.reshape(train_X, (n_train_samples,steps,features_number))#(样本数,步长,特征数) test_X = np.reshape(test_X, (n_test_samples,steps,features_number)) #LSTM网络搭建 model=Sequential() model.add(LSTM(input_shape=(steps,features_number))) model.add(LSTM(100,dropout=0.2, recurrent_dropout=0.2,Activation='relu',return_sequence=False) model.add(Dense(14, activation='softmax') model.compile(loss='categorical_crossentropy', optimizer=keras.optimizers.Adam(), metrics=['accuracy']) print(model.summary()) #Keras设置学习率动态减少 from keras.callbacks import ReduceLROnPlateau reduce_lr = ReduceLROnPlateau(monitor='val_loss', patience=10, mode='auto')#(监测目标='val_loss',patience=10调整频率每10个epoch看下目标loss) model.fit(train_X, train_y, batch_size=32, epochs=500,validation_split=0.1,callbacks=[reduce_lr]) score = model.evaluate(test_X, test_y,batch_size=128, verbose=1) if __name__ == '__main__': main() ----------------------------------------------------- ##注意3Keras设置学习率动态减少,还有另外一种方式,下面附上代码: import keras.backend as K from keras.callbacks import LearningRateScheduler def scheduler(epoch):# 每隔100个epoch,学习率减小为原来的1/10 if epoch % 100 == 0 and epoch != 0: lr = K.get_value(model.optimizer.lr) K.set_value(model.optimizer.lr, lr * 0.1) print("lr changed to {}".format(lr * 0.1)) return K.get_value(model.optimizer.lr) reduce_lr = LearningRateScheduler(scheduler) model.fit(train_x, train_y, batch_size=32, epochs=5, callbacks=[reduce_lr])
《AI工匠BOOK》持续更新AI算法与最新应用,如果您感兴趣,欢迎关注AI工匠(AI算法与最新应用前沿研究)。
AI工匠不定期发放福利啦~~限时先到先得奥~
CPU训练太慢,GPU加速几个小时搞定3天的模型计算量。稍后我会更博推出手把手教程如何搭建深度学习环境,配置TF1.0-GPU-jupyterbook-CUDNN-CUDA 。也有已经搭建好的TF1.0镜像可以一键分享,直接拎数据跑转模型。
租用服务器GPU的童鞋,福利传送门:
最近特价2折起的云服务器活动收集: https://www.aliyun.com/acts/limit-buy?userCode=6o4lpfcuESC
AI工匠BOOK赠送云服务器通用2000元优惠券链接:https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=6o4lpfcu
针对24岁以下的AI爱好者,AI工匠book奉上福利传送门楼主已过福利带宽年龄TOT~
1.轻量应用服务器 1C2G 1000G流量包 5M宽带 40G系统盘 9.5/月 一年仅需114元(官网售价1740元)
✅2.云服务器ECS 1C2G 1M宽带 40G系统盘 9.5/月 一年仅需114元(官网售价1452元)
符合24周岁以下新客要求可享受以上价格~~
轻量应用服务器福利——24岁以下点击这里领取你的福利包拉
- DL之Keras:基于Keras框架建立模型实现【预测】功能的简介、设计思路、案例分析、代码实现之详细攻略(经典,建议收藏)——daidingdaidingdaiding
- 【Python十分钟写出聊天机器人】基于Keras实现seq2seq模型
- 深度学习之六,基于RNN(GRU,LSTM)的语言模型分析与theano代码实现
- 基于Spark MLlib平台和基于模型的协同过滤算法的电影推荐系统(二)代码实现
- Ch2r_ood_understanding 本文档为论文限定领域口语对话系统中超出领域话语的对话行为识别的部分实验代码。代码基于Python,需要用到的外部库有: Keras(搭建神经网络) S
- 基于RBAC模型的权限管理系统的设计和实现
- 基于RBAC模型的权限管理系统的设计和实现
- [20180313智慧餐厅推荐系统02]基于python的socket编程代码,实现PC与服务器的简单通信
- 基于RBAC扩展模型的实验室综合管理系统设计与实现
- 基于模型融合的推荐系统实现(3):模型融合
- RBM算法模型应用在推荐系统 Python代码实现
- js通过googleAIP翻译PHP系统的语言配置的实现代码
- js通过googleAIP翻译PHP系统的语言配置的实现代码
- [原][osg][osgEarth]基于qt代码实现:TCP|UDP与飞行模拟软件JSBSim的通信,现实模型飞行!
- 学习笔记TF035:实现基于LSTM语言模型
- keras的LSTM文本分类预处理及代码简单实现
- 基于双链式条件随机场(2-CRF)的联合多词表达识别抽取(论文解读)+Bi-LSTM+CRF实现多词表达抽取(代码实践)
- 【番剧推荐系统设计】基于 Flask 与 MySQL 实现番剧推荐系统(Python代码)(1)
- 基于模型设计的FPGA开发与实现:滤波器设计与实现(三)Matlab中滤波器的HDL代码生成
- Sharepoint学习笔记―ECMAScript对象模型--实现编写代码时的智能提示功能