seq2seq 的 keras 实现
来源:互联网 发布:淘宝关闭无法激活 编辑:程序博客网 时间:2024/05/29 05:01
上一篇 seq2seq 入门 提到了 cho 和 Sutskever 的两篇论文,今天来看一下如何用 keras 建立 seq2seq。
第一个 LSTM 为 Encoder,只在序列结束时输出一个语义向量,所以其 “return_sequences” 参数设置为 “False”
使用 “RepeatVector” 将 Encoder 的输出(最后一个 time step)复制 N 份作为 Decoder 的 N 次输入
第二个 LSTM 为 Decoder, 因为在每一个 time step 都输出,所以其 “return_sequences” 参数设置为 “True”
from keras.models import Sequentialfrom keras.layers.recurrent import LSTMfrom keras.layers.wrappers import TimeDistributedfrom keras.layers.core import Dense, RepeatVectordef build_model(input_size, max_out_seq_len, hidden_size): model = Sequential() # Encoder(第一个 LSTM) model.add( LSTM(input_dim=input_size, output_dim=hidden_size, return_sequences=False) ) model.add( Dense(hidden_size, activation="relu") ) # 使用 "RepeatVector" 将 Encoder 的输出(最后一个 time step)复制 N 份作为 Decoder 的 N 次输入 model.add( RepeatVector(max_out_seq_len) ) # Decoder(第二个 LSTM) model.add( LSTM(hidden_size, return_sequences=True) ) # TimeDistributed 是为了保证 Dense 和 Decoder 之间的一致 model.add( TimeDistributed(Dense(output_dim=input_size, activation="linear")) ) model.compile(loss="mse", optimizer='adam') return model
也可以用 GRU 作为 RNN 单元,代码如下,区别就是将 LSTM 处换成 GRU:
from keras.layers.recurrent import GRUfrom keras.layers.wrappers import TimeDistributedfrom keras.models import Sequential, model_from_jsonfrom keras.layers.core import Dense, RepeatVector def build_model(input_size, seq_len, hidden_size): """建立一个 sequence to sequence 模型""" model = Sequential() model.add(GRU(input_dim=input_size, output_dim=hidden_size, return_sequences=False)) model.add(Dense(hidden_size, activation="relu")) model.add(RepeatVector(seq_len)) model.add(GRU(hidden_size, return_sequences=True)) model.add(TimeDistributed(Dense(output_dim=input_size, activation="linear"))) model.compile(loss="mse", optimizer='adam') return model
上面是一个最简单的 seq2seq 模型,因为没有将 Decoder 的每一个时刻的输出作为下一个时刻的输入。
当然,我们可以直接用 keras 的 seq2seq 模型:
https://github.com/farizrahman4u/seq2seq
下面是几个例子:
简单的 seq2seq 模型:
import seq2seqfrom seq2seq.models import SimpleSeq2Seqmodel = SimpleSeq2Seq(input_dim=5, hidden_dim=10, output_length=8, output_dim=8)model.compile(loss='mse', optimizer='rmsprop')
深度 seq2seq 模型:encoding 有 3 层, decoding 有 3 层
import seq2seqfrom seq2seq.models import SimpleSeq2Seqmodel = SimpleSeq2Seq(input_dim=5, hidden_dim=10, output_length=8, output_dim=8, depth=3)model.compile(loss='mse', optimizer='rmsprop')
encoding 和 decoding 的层数也可以不同:encoding 有 4 层, decoding 有 5 层
import seq2seqfrom seq2seq.models import SimpleSeq2Seqmodel = SimpleSeq2Seq(input_dim=5, hidden_dim=10, output_length=8, output_dim=20, depth=(4, 5))model.compile(loss='mse', optimizer='rmsprop')
上面几种也是最简单的 SimpleSeq2Seq 的应用。
在论文 Sequence to Sequence Learning with Neural Networks 给出的 seq2seq 中,encoder 的隐藏层状态要传递给 decoder,而且 decoder 的每一个时刻的输出作为下一个时刻的输入,而且这里内置的模型中,还将隐藏层状态贯穿了整个 LSTM:
import seq2seqfrom seq2seq.models import Seq2Seqmodel = Seq2Seq(batch_input_shape=(16, 7, 5), hidden_dim=10, output_length=8, output_dim=20, depth=4)model.compile(loss='mse', optimizer='rmsprop')
cho 的这篇论文 Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation 中的 seq2seq 模型实现为:decoder 在每个时间点的语境向量都会获得一个 ‘peek’
import seq2seqfrom seq2seq.models import Seq2Seqmodel = Seq2Seq(batch_input_shape=(16, 7, 5), hidden_dim=10, output_length=8, output_dim=20, depth=4, peek=True)model.compile(loss='mse', optimizer='rmsprop')
在论文 Neural Machine Translation by Jointly Learning to Align and Translate 中带有注意力机制的 seq2seq:没有隐藏状态的传播,而且 encoder 是双向的 LSTM
import seq2seqfrom seq2seq.models import AttentionSeq2Seqmodel = AttentionSeq2Seq(input_dim=5, input_length=7, hidden_dim=10, output_length=8, output_dim=20, depth=4)model.compile(loss='mse', optimizer='rmsprop')
参考:
https://github.com/farizrahman4u/seq2seq
http://www.zmonster.me/2016/05/29/sequence_to_sequence_with_keras.html
http://jacoxu.com/encoder_decoder/
推荐阅读
历史技术博文链接汇总
也许可以找到你想要的
- seq2seq 的 keras 实现
- 十分钟掌握Keras实现RNN的seq2seq学习
- 十分钟教程:用Keras实现seq2seq学习
- Seq2Seq in Keras 示例
- keras系列︱seq2seq系列相关实现与案例(feedback、peek、attention类型)
- keras的lenet实现
- GAN 的 keras 实现
- GAN 的 keras 实现
- TensorFlow实现seq2seq
- TensorFlow实现seq2seq
- keras的自编码实现
- 实现自己的Keras层
- seq2seq
- seq2seq
- 用tensorflow实现seq2seq模型
- Word2vec+seq2seq实现对话系统
- Keras框架下LSTM的一种实现
- keras实现简单的函数拟合逼近
- 3个著名加密算法(MD5、RSA、DES)的解析
- anaconda3 安装python包
- 设计模式--缺省适配器模式
- 51nod 1279 扔盘子(单调栈)
- 蓝牙BLE基础:CC2541通信系列之模拟IIC协议
- seq2seq 的 keras 实现
- seq2seq 入门
- 关于VS动态库和静态库编译问题
- 什么是 Dropout
- 《软件工程(C编码实践篇)》学习心得
- 用 LSTM 做时间序列预测的一个小例子
- 蓝牙BLE基础:CC2541通信系列之模拟SPI协议
- Mybatis操作数据库的方式
- gdb调试时出现 No symbol "XXXXX" in current context