#定义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)
来源:CSDN
作者:up_XCY
链接:https://blog.csdn.net/up_XCY/article/details/103738651