使用tensorflow实现seq2seq
上篇文章记录了seq2seq和attention机制的基本原理,这篇文章趁热打铁看看如何自己写代码实现。
tf2的一些API操作
推荐一个学习tensorflow的教程:https://github.com/lyhue1991/eat_tensorflow2_in_30_days
1 | import tensorflow as tf |
连接操作(tf.concat)
1 | t1 = [[1, 2, 3], [4, 5, 6]] # 2, 3 |
增加维度的操作(tf.expand_dims)
1 | t3 = [[1, 2, 3],[4, 5, 6]] # shape [2, 3] |
减维操作(tf.squeeze)
1 | t4 = tf.expand_dims(t3, 2) |
注意: tf.squeeze只能从张量形状中移除大小为1的维度 ,如果上面设置axis=0或1,将会报错。
更改维度操作(tf.reshape)
1 | tf.reshape(t3, [3, 2]) |
类型转换操作(tf.cast)
1 | x = tf.constant([1.8, 2.2], dtype=tf.float32) |
堆叠操作(tf.stack)
1 | x = tf.constant([1, 4]) |
不含attention的seq2seq实现
Encoder
1 | class Encoder(tf.keras.Model): |
Decoder
1 | class Decoder(tf.keras.Model): |
测试代码
1 | if __name__ == "__main__": |
含attention的seq2seq实现
encoder
1 | class Encoder(tf.keras.Model): |
decoder
1 | class Decoder(tf.keras.Model): |
attention实现
1 | class BahdanauAttention(tf.keras.Model): |
随机初始化输入数据和一些必要参数来进行测试
1 | # 加载训练好的词向量矩阵 |
输出
1 | Encoder output shape: (batch size, sequence length, hidden_dim) (64, 250, 1024) |
hidden_dim与enc_units一个意思