RNN LSTM 循环神经网络 (分类例子)

设置 RNN 的参数

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
tf.set_random_seed(1)   # set random seed

# 导入数据
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)

# hyperparameters
lr = 0.001                  # learning rate
training_iters = 100000     # train step 上限
batch_size = 128            
n_inputs = 28               # MNIST data input (img shape: 28*28)
n_steps = 28                # time steps
n_hidden_units = 128        # neurons in hidden layer
n_classes = 10              # MNIST classes (0-9 digits)
# x y placeholder
x = tf.placeholder(tf.float32, [None, n_steps, n_inputs])
y = tf.placeholder(tf.float32, [None, n_classes])

# 对 weights biases 初始值的定义
weights = {
    # shape (28, 128)
    'in': tf.Variable(tf.random_normal([n_inputs, n_hidden_units])),
    # shape (128, 10)
    'out': tf.Variable(tf.random_normal([n_hidden_units, n_classes]))
}
biases = {
    # shape (128, )
    'in': tf.Variable(tf.constant(0.1, shape=[n_hidden_units, ])),
    # shape (10, )
    'out': tf.Variable(tf.constant(0.1, shape=[n_classes, ]))
}

定义 RNN 的主体结构

这个 RNN 总共有 3 个组成部分 ( input_layer, cell, output_layer).

首先定义 input_layer:

cell 的计算:

state_is_tuple=True 将在之后的版本中变为默认.

对于 lstm 来说, state可被分为(c_state, h_state).

使用tf.nn.dynamic_rnn(cell, inputs), 要确定 inputs 的格式.

tf.nn.dynamic_rnn 中的 time_major 参数会针对不同 inputs 格式有不同的值.

如果 inputs 为 (batches, steps, inputs) ==> time_major=False

如果 inputs 为 (steps, batches, inputs) ==> time_major=True

output_layerreturn 的值:

方式一: 直接调用final_state 中的 h_state (final_state[1]) 来进行运算:

方式一: 调用最后一个 outputs (在这个例子中,和上面的final_state[1]是一样的):

输出 result:

计算 costtrain_op:

训练 RNN

Last updated

Was this helpful?