LSTM应用汇总

故事扮演 提交于 2019-12-28 00:39:02

#定义LSTM
lstm = tf.nn.rnn_cell.BasicLSTMCell(lstm_hidden_size)

#将lstm的状态初始化为全0数组
#state.c和state.h分别对应图中的c状态和h状态
#和其他神经网络一样,在优化循环神经网络时,每次也会使用一个batch的训练样本。
state = lstm.zero_state(batch_size,tf.float32)

#定义损失
loss = 0.0
#前馈网络
for i in range(num_steps):
    #每一步处理时间序列中的一个时刻。将当前输入current_input(Xt)和前一时刻状态
    #state(Ht-1和Ct-1)传入定义的LSTM结构可以得到当前LSTM的输出lstm_output(Ht)和
    #更新后状态state(Ht和Ct)。lstm_output用于输出给其他层,state用于输出给下一时刻,
    #它们在dropout等方面可以有不同的处理方式。
    lstm_output,state = lstm(current_input,state)
    
    #将当前时刻LSTM结构的输出传入一个全连接层得到最后的输出
    final_output = fully_connected(lstm_output)
    
    #计算当前时刻输出的损失
    loss += calc_loss(final_output,expected_output)
    
    
    

#双层LSTM应用

#定义一个基本的LSTM结构作为循环体的基础结构。
lstm_cell = tf.nn.rnn_cell.BasicLSTMCell

#通过MultiRNNCell类实现深层循环网络中每一个时刻的前向传播过程。
stacked_lstm = tf.nn.rnn_cell.MultiRNNCell(
 [lstm_cell(lstm_cell) for _ in range(num_of_layers)])

#通过zero_state函数来获取初始状态。
state = stacked_lstm.zero_state(batch_size,tf.float32)

#计算每一时刻的前向传播结果。
for i in range(len(num_steps)):
    stacked_lstm_output,state = stacked_lstm(current_input,state)
    final_output = fully_connected(stacked_lstm_output)
    loss += calc_loss(final_output,expected_output)


    
    
    
#循环神经网络的dropout

#定义LSTM结构
lstm_cell = tf.nn.rnn_cell.BasicLSTMCell

#使用DropoutWrapper类来实现dropout功能
#该类通过两个参数来控制dropout的概率。
#一个为input_keep_prob,它可以用来控制输入的dropout概率:
#另一个为output_keep_prob,它可以用来控制输出的dropout概率。
stacked_lstm = tf.nn.rnn_cell.MultiRNNCell(
[tf.nn.rnn_cell.DropoutWrapper(lstm_cell(lstm_size),output_keep_prob=dropout_keep_prob)
 for _ in range(number_of_layers)])

#另一种形式
dropout_keep_prob = LSTM_KEEP_PROB if istraining else 1.0

lstm_cells = [tf.nn.rnn_cell.DropoutWrapper(
              tf.nn.rnn_cell.BasicLSTMCell(HIDDEN_SIZE),output_keep_prob=dropout_keep_prob)
              for _ in range(NUM_LAYERS)]
cell = tf.nn.rnn_cell.MuitiRNNCell(lstm_cells)


#初始化最初的状态
state = cell.zero_state(batch_size,tf.float32)

#定义单词的词向量矩
embedding = tf.get_variabel("embedding",[VOCAB_SIZE,HIDDEN_SIZE])

#将单词向量转换为词向量
inputs = tf.nn.embedding_lookup(embedding,input_data)

#只在训练的时候使用dropout
if is_training:
    inputs = tf.nn.dropout(inputs,EMBEDDING_KEEP_PROB)
    

    
    
    
#使用多层LSTM结构,输入X输出最上面一层的Y

cell = tf.nn.rnn_cell.MuitiRNNCell([
    tf.nn.rnn_cell.BasicLSTMCell(HIDDEN_SIZE)
     for _ in range(NUM_LAYERS)
])

#使用Tensorflow接口将多层的LSTM结构连接成RNN网络并计算其前向传播结果。
outputs,_ = tf.nn.dynamic_rnn(cell,X,dtype=float32)
#outputs是顶层LSTM在每一步的输出结果,它的维度是[batch_size,time,HIDDEN_SIZE]。
#如果只关注最后一个时刻的输出结果:
output = outputs[:,-1,:]

#定义交叉熵损失
loss = tf.nn.sparse_softmax_cross_entropy_with_logits(
        labels=y,logits=predict_logits)


 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!