深层循环神经网络是循环神经网络的另一种变种,为了增强模型的表达能力,可以将每一个时刻上的循环体重复多次。和卷积神经网络类似,每一层的循环体中参数是一致的,而不同层中的参数可以不同。为了更好的支持深层循环神经网络,tensorflow中提供了MultiRNNCell类来实现深层循环神经网络的前向传播过程。以下代码展示如何使用这个类:
lstm=tf.contrib.rnn.BasicLSTMCell(lstm_size)stacked_lstm=tf.contrib.rnn.MultiRNNCell([lstm]*number_of_layers)state=stacked_lstm.zero_state(batch_size,tf.float32)for i in range(len(num_steps)): if i >0: tf.get_variable_scope().reuse_variables() stacked_lstm_output,state=stacked_lstm(current_input,state) final_output=fully_connected(stacked_lstm_output) loss+=calc_loss(final_output,expected_output)
可以看到,相比于之前的LSTM,深层LSTM就是在BasicLSTMCell的基础上封装一层tf.contrib.rnn.MultiRNNCell()就可以实现。
循环神经网络的dropout:
循环神经网络中的dropout具有和CNN类似的功能,CNN只在最后的全连接层中使用dropout,循环神经网络一般只在不同层循环体结构之间使用dropout,而不在同一层的循环体结构之间使用。也就是说从时刻t-1传递到时刻t时,循环神经网络不会进行状态的dropout,而在同一时刻t中,不同层循环体之间会使用dropout。在tensorflow中,使用tf.contrib.rnn.DropoutWrapper()类可以很容易实现dropout功能,代码实现如下所示:
lstm=tf.contrib.rnn.BasicLSTMCell(lstm_size)dropout=tf.contrib.rnn.DropoutWrapper(lstm,output_keep_prob=0.7)stacked_lstm=tf.contrib.rnn.MultiRNNCell([dropout_lstm]*num_of_layers)