畅游人工智能之海--Keras教程之循环神经网络(五)

畅游人工智能之海--Keras教程之循环神经网络(五) | 双向循环神经网络

写在开篇

在keras的循环层\(GRU\)\(LSTM\)等中的keras声明中,有一个叫做\(go\_backwards\)的参数。参数的取值为\(true\)或者\(false\)。如果取值为\(true\),输入的序列数据就会被反向处理,并且默认是\(false\),也就是正向处理数据。举个例子,比如\(RNN\)的输入是\(a,b,c,d,e\),如果\(go\_backwards=true\),输入就是\(e,d,c,b,a\)\(go\_backwards\)参数的设置具有一定的意义。

\(go\_backwards\) 的意义所在

循环神经网络本质上处理的是时序信息,或者是分先后顺序的信息。在文本的处理中经常用到,在此不做深究,我们只认为\(RNN\)的处理结果中包含了,时序信息。而且包含的时序信息越多,处理的效果就越好。而正序处理和倒序处理包含了不同的时序信息。这是\(go\_backwards\)参数的意义所在,也是双向循环层的意义所在。

Bidirectional

整体效果

在一次处理中,正向处理一遍,反向处理一遍,时间代价不变,空间代价加倍,获取更多序列信息。

keras实现

1
2
3
tf.keras.layers.Bidirectional(
layer, merge_mode="concat", weights=None, backward_layer=None, **kwargs
)

\(keras\)中的\(Bidirectional\)其实不是一个单独的layer,而是一个wrapper。先看一个例子。

1
2
3
4
5
6
7
8
9
model = Sequential()
forward_layer = LSTM(10, return_sequences=True)
backward_layer = LSTM(10, activation='relu', return_sequences=True,
go_backwards=True)
model.add(Bidirectional(forward_layer, backward_layer=backward_layer,
input_shape=(5, 10)))
model.add(Dense(5))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop')

在声明中,我们需要实例化两个循环神经网络层,这个循环层可以是\(RNN,LSTM,GRU\)等,然后将这两个实例化层作为参数传给tf.keras.layers.Bidirectional即可。

总结

比较核心的layer都已经讲完了,接下来会分享一些同样重要的点,比如metrics、callbacks等,他们对于准确率的提升,训练过程的控制等都有重要意义。