循环神经网络入门的一个总结

1、常用神经网络结构中有个叫RNN的,即循环神经网络。

假设有n个cell,从第一个cell开始说起。

state 0+time0 进入cell ,cell处理,处理后的结果,可以分成两个相同的,一个用来输出该层的输出,另一个送给下一个cell,当然,分成两个相同的之后,想怎么变就怎么变。

对第二个cell来说,第一次的输出和当前时间,是他的输出,就这样,上一个输出始终作为下一个的输入。

深层循环是什么意思呢,就是我们不是两个输出吗,一个用来给下一个cell,那另一个是不是就可以在这个cell的基础上,往深处传播,当然,这个深处在自然语言处理中,一般用于处理单词的词向量。

2、在循环神经网络中,有个结构叫长短期记忆网络(LSTM)

为什么会有个长短期记忆网络呢,因为循环网络实在太长了,但是前面的很多东西我们根本用不上,所以呢 ,对于某些cell来说,我就要忘记一些东西。所以就有了长短期记忆网络。长短期记忆网络的总体结构和上面循环神经网络很像,不过呢,他会多了一个遗忘门,对于以往输入的数据,他会根据当前数据选择性的删除。

#定义LSTM结构
lstm = rnn_cell.BasicLSTMCell(lstm_hidden_size)
#状态初始化,初始化为一个全0数组
state = lstm.zero_state(batch_size,tf.float32)
#loss初始化
loss = 0.0
#规定一个长度,在这个长度内进行运算,太长了对计算机负担太大并且没有必要,这个for语句,实际上就是循环运算, 每次get——variable——socpe,再将lstm算得的数据输出,最后加上。
for i in range(num_steps):
    if i > 0 : tf.get_variable_scope().reuse_variables()
    lstm_output, state = lstm(current_input, state)
    final_output = fully_connected(lstm_output)
    
    loss += calc_loss(final_output, expected_output)

3、深层神经网络的代码基础

lstm = rnn_cell.BasicLSTMCell(lstm_size)
#实际上,我们发现,深层循环网络相比普通的,就是在原来的lstm基础上,以lstm*层数为参数,输入到新的函数:MultiRNNCell里面即可。
stacked_lstm = rnn_cell.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)

4、循环神经网络的dropout

lstm = rnn_cell.BasicLSTMCell(lstm_size)
#dropout实际上是将原来的lstm输入函数中,生成一个dropout的latm
dropout_lstm = tf.nn.rnn_cell.DropoutWrapper(lstm,output_keep_prob=0.5)
#实际上,我们发现,深层循环网络相比普通的,就是在原来的lstm基础上,以dropout_lstm*层数为参数,输入到新的函数:MultiRNNCell里面即可。
stacked_lstm = rnn_cell.MultiRNNCell([dropout_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)