在End To End speech里介绍了一种更好的seq2seq的模型,效果我没有实际比较过,但是思路值得学习,接下来分享下,我的理解。
虽然这篇论文讲的是Text To speech,但是主要模型架构使用的是seq2seq。主要的改进也就是引入了CBHG模型,Conv-Bank-Highway-Gru_rnn。
在encode端之后,加入了pre-net,也就是使用非线性变换,作用在每一个序列嵌入到连续向量之后,并且使用dropout作为bottleneck提高泛化能力。
pre-net之后,讲编码序列传入Attention,再进行decode输出。
无论是encode还是decode,都是使用之前所说的CBHG模型。在模型构造中,第一层是conv1d-bank卷积;第二层是highway,这是一种将输入复制为两份,一份进行网络处理,另一份不进行,直接跳到网络,最后两份按不同比例合成。第三层是gru-rnn,gru单元和lstm很相似(阅读)。
接下来,用代码表达。
建立embedding映射。
def embed(inputs, vocab_size, num_nuits, zero_pad=True, scope="embedding", reuse=None):
with tf.variable_scope(scope, reuse=reuse):
lookup_table = tf.get_variable('lookup_table',
dtype=tf.float32,
shape=[vocab_size, num_nuits],
initializer=tf.truncated_normal_initiali