本质就是计算两个RNN,先计算一遍前向的,然后计算后向的,结果是结合这两个的输出结果。
前向和后向的输入是一样的,输出是前向的输出结合后向的输出。
可以看到Forward层和Backward层共同连接着输出层,其中包含了6个共享权值w1-w6。在Forward层从1时刻到t时刻正向计算一遍,得到并保存每个时刻向前隐含层的输出。在Backward层沿着时刻t到时刻1反向计算一遍,得到并保存每个时刻向后隐含层的输出。最后在每个时刻结合Forward层和Backward层的相应时刻输出的结果得到最终的输出,用数学表达式如下:
用keras实现也是非常简单,只需要使用Bidirectional()将RNN包裹起来即可,参考:
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense, GRU, Bidirectional
maxlen = 5 # time_step
max_features = 40 # 输入向量维度
model = Sequential()
#双向RNN
model.add(Bidirectional(GRU(units), input_shape=(maxlen, max_features)))
#输出层 2分类
model.add(Dense(units=1, activation='sigmoid'))
#模型可视化
model.summary()