TensorFlow技术解析与实战 11 自然语言处理
来源:互联网 发布:php图书管理系统 编辑:程序博客网 时间:2024/05/20 07:49
与图像识别不同,在自然语言处理中输入的往往是一段语音或者一段文字,输入数据的长短是不确定的,并且它与上下文有很密切的关系,所以常用的是循环神经网络(recurrent neural network,RNN)模型
11.1 模型的选择
使用不同输入和不同数据时,分别适用哪种模型以及如何应用
(1)一对一:没有使用RNN,如Vanilla模型,从固定大小的输入得到固定大小输出(应用在图像分类)
(2)一对多:以序列输出(应用在图片描述,输入一张图片输出一段文字序列,这种往往需要CNN和RNN相结合,也就是图像和语言结合)
(3)多对一:以序列输入(应用在情感分析,输入一段文字,然后将它分类成积极或者消极情感,如淘宝下某件商品的评论分类),如使用LSTM
(4)多对多:异步的序列输入和序列输出(应用在机器翻译,如一个RNN读取一条英文语句,然后将它以法语形式输出)。
(5)多对多:同步的序列输入和序列输出(应用在视频分类,对视频中每一帧打标记)。
因为中间RNN的状态的部分是固定的,可以多次使用,所以不需要对序列长度进行预先特定约束。参见Andrej Karpathy 的文章《The Unreasonable Effectiveness of Recurrent Neural Networks》
11.2 英文数字语音识别
数据集,构建LSTM循环神经网络,用TFLearn第三方库来训练
本节代码参本 https://github.com/pannous/tensorflow-speech-recognition/blob/master/speech2text-tflearn.py
定义输入数据并预处理数据:用到梅尔频率倒谱系数(MFCC)特征向量,一种在自动语音和说话人识别广泛使用的特征。
# -*- coding: utf-8 -*-import sysreload(sys)sys.setdefaultencoding('utf-8')import tflearnimport speech_dataimport tensorflow as tf learning_rate = 0.0001training_iters = 300000batch_size = 64width = 20 # MFCC特征height = 80 # 最大发音长度classes = 10 # 数字类别# 对语音做分帧、取对数、逆变换等操作后,生成的MFCC就代表这个语音的特征batch = word_batch = speech_data.mfcc_batch_generator(batch_size) #生成每一批MFCC语音X, Y = next(batch)trainX, trainY = X, YtestX, testY = X, Y# 定义网络模型net = tflearn.input_data([None, width, height])net = tflearn.lstm(net, 128, dropout=0.8)net = tflearn.fully_connected(net, classes, activation='softmax')net = tflearn.regression(net, optimizer='adam', learning_rate=learning_rate, loss='categorical_crossentropy')# 训练模型model = tflearn.DNN(net, tensorboard_verbose=0)while 1: model.fit(trainX, trainY, n_epoch=10, validation_set=(testX, testY), show_metric=True, batch_size=batch_size)_y = model.predict(X)model.save("tflearn.lstm.model")# 预测模型demo_file = "5_Vicki_260.wav"demo = speech_data.load_wav_file(speech_data.path + demo_file)result = model.predict([demo])result = numpy.argmax(result)print("predicted digit for %s : result = %d "%(demo_file, result))
11.3 智能聊天机器人
智能聊天机器人的商业价值有两个方面:
- 通过和用户的“语音机器人”的对话,将用户引导到对应的服务上面。
- 作为今后智能硬件和智能家居的嵌入式应用
经历了3代不同的技术:
- 基于特征工程。大量的逻辑判断
- 基于检索库
- 基于深度学习。采用seq2seq+Attention模型,经过大量的训练,根据输入生成相应的输出。
seq2seq模型是一个翻译模型,主要是把一个序列翻译成另一个序列。它的基本思想是用两个RNNLM,组成RNN编码器-解码器。在文本处理领域,常用编码器-解码器框架
对于一个句子对<X, Y>,X由x1,x2等单词序列组成,Y也由y1, y2等单词序列组成。在句子比较短的时候,还能比较贴切,句子长是,就明显不合语义了。
在实际实现聊天系统的时候,一般编码器和解码器都采用RNN模型以及LSTM。但句子长度超过30以后,LSTM模型的效果会急剧下降,一般此时会引入Attention模型,对长句子来说能够明显提升系统效果。
Attention机制是认知心理学层面的一个概念,它是指当人在做一件事情的时候,会专注地做这件事而忽略周围的其他事。这种机制应用在聊天机器人、机器翻译等领域,就把源句子中对生成句子重要的关键词的权重提高,产生出更准确的应答。
增加了Attention模型的编码器-解码器框架,现在的中间语义编码变成了不断变化的Ci,能够生产更准确的目标Yi。
本节代码参本 https://github.com/suriyadeepan/easy_seq2seq
使用康莱尔大学的Corpus数据集(Cornell Movie Dialogs Corpus),里面含有600多部电影的对白。
处理聊天数据:
(1)先把数据集整理成“问”和“答”的文件,生成.enc(问句)和.dec(答句)文件,
- test.dec # 测试集答句
- test.enc # 测试集问句
- train.dec # 训练集答句
- train.enc # 训练集问句
(2)创建词汇表,然后把问句和答句转换成对应的id形式。词汇表的文件里面有2万个词汇,如下:
- vocab20000.dec # 答句的词汇表
- vocab20000.enc # 问句的词汇表
词汇表的内容如下:
_ PAD
_ GO
_ EOS
_ UNK
.
'
,
I
?
you
the
to
a
s
t
it
其中_GO、_EOS、_UNK、_PAD是在seq2seq模型中使用的特殊标记,用来填充标记对话:_GO标记对话开始;_EOS标记对话结束;_UNK标记未出现在词汇表中的字符,用来替换稀有词汇;_PAD是用来填充序列,保证批次中的序列有相同的长度。
转换成的ids文件如下:
- test.enc.ids20000
- train.dec.ids20000
- train.enc.ids20000
问句和答句转换成的ids文件中,每一行是一个问句或答句,每一行中的每一个id代表问句或答句中对应位置的词,格式如下:
185 4 4 4 146 131 5 1144 39 313 53 102 1176 12042 4 2020 9 2691 9
792 15 4
(3)采用编码器-解码器框架进行训练
定义训练参数,seq2seq.ini
[strings]# 模式:train, test, servemode = traintrain_enc = data/train.enctrain_dec = data/train.dectest_enc = data/test.enctest_dec = data/test.dec# 模型文件和词汇表的存储路径working_directory = working_dir/[ints]# 词汇表大小enc_vocab_size = 20000dec_vocab_size = 20000# LSTM层数num_layers = 3# 每层大小,可以取值:128, 256, 512, 1024layer_size = 256max_train_data_size = 0batch_size = 64# 每多少次迭代存储一次模型steps_per_checkpoint = 300[floats]learning_rate = 0.5learning_rate_decay_factor = 0.99max_gradient_norm = 5.0定义网络模型 seq2seq_model.py
参本论文《Grammar as a Foreign Language》:http://arxiv.org/abs/1412.7449
- TensorFlow技术解析与实战 11 自然语言处理
- TensorFlow 技术解析与实战 笔记 01
- TensorFlow技术解析与实战 4 基础知识
- tensorflow55 《TensorFlow技术解析与实战》16 TensorFlow Debugger
- TensorFlow技术解析与实战 7 TensorFlow 的高级框架
- TensorFlow技术解析与实战 8 第一个tensorflow程序
- TensorFlow技术解析与实战 10 人脸识别
- TensorFlow技术解析与实战 13 生成式对抗网络
- Tensorflow实战学习(十七)【自然语言处理、RNN、LSTM】
- python与自然语言处理之贝叶斯实战
- tensorflow54 《TensorFlow技术解析与实战》15 TensorFlow线性代数编译框架XLA
- tensorflow56 《TensorFlow技术解析与实战》06 神经网络的发展及其Tensorflow实现
- tensorflow57 《TensorFlow技术解析与实战》07 Tensorflow的高级框架-tflearn
- tensorflow58 《TensorFlow技术解析与实战》07 Tensorflow的高级框架-keras
- tensorflow59 《TensorFlow技术解析与实战》08 第一个tensorflow程序
- tensorflow60 《TensorFlow技术解析与实战》09 Tensorflow在mnist中的应用
- TensorFlow技术解析与实战 6 神经网络的发展及其 TensorFlow 实现
- TensorFlow技术解析与实战 9 TensorFlow在MNIST中的应用
- 微信小程序
- TensorFlow持久化
- Codeforces Round #450 (Div. 2)
- 5G相关知识
- TensorFlow入门案例分析
- TensorFlow技术解析与实战 11 自然语言处理
- 【JZ2440】自我学习记录【如何学习一个新的芯片:S3C2440】
- 图像分割之(五)边缘检测Laplace详解
- 使用TCP协议编写一个网络程序,设置服务器端的监听端口是8002,当与客户端建立连接后,服务器端向客户端发送数据“Hello, world”,客户端收到数据后打印输出
- Redis数据结构及其常用命令
- HDOJ 2040 亲和数
- MVC前台上传文件到服务器
- vb.net 教程 8-3 数据库操作9-3
- 判断是否为平衡二叉树