循环神经网络(3)

深层循环神经网络是循环神经网络的另一种变种,为了增强模型的表达能力,可以将每一个时刻上的循环体重复多次。和卷积神经网络类似,每一层的循环体中参数是一致的,而不同层中的参数可以不同。为了更好的支持深层循环神经网络,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)

 

posted @ 2018-04-10 18:41  小丑_jk  阅读(194)  评论(0编辑  收藏  举报