用rnn训练mnist数据集
与以往cnn卷积神经网路不同,rnn的思想是数据信息有顺序,所以rnn一般用来训练文本数据信息,就像小时候的填空题一样,我们能根据上下文判断这个空应该填什么,这前面的文字和后面的文字都是有顺序的。
用rnn训练图片分类也有其优点,例如每个人都是头朝上脚朝下(个别倒立的例外),在这里我们就用rnn网络训练mnist数据集。
mnist手写数字图片是28*28的,假设每次训练128张图片, 则训练集数据的shape为[128, 28, 28]
这里主要讲一下rnn神经网络:
rnn是个有向循环网络,以这个demo为例,图片是28*28的,以28轮向rnn网络添加Xt信息(X1-X28),每次的信息量是(batch_size, 28),与U进行矩阵相乘,(每一轮的U,W,V是通用的),运算公式:
g,f都是对应的激活函数,设:
Xt.shape=[b, m]
U.shape=[m, n], n为隐藏节点个数
W.shape=[n, n]
S(t-1) = [b, n]
所以St = tf.matmul(tf.concat([Xt, S(t-1)], -1), tf.concat([U, W], 0))
在这里我们只有n(隐藏节点个数)和S0是未知的 ,在代码实现中,我们只需要3句代码就能实现rnn网络过程:
# 初始化隐藏节点个数
rnn_cell = tf.nn.rnn_cell.BasicLSTMCell(hidden_num)
# 初始化S0
init_state = rnn_cell.zero_state(batch_size, dtype=tf.float32)
# 构建完整的rnn网络
out, out_last = tf.nn.dynamic_rnn(rnn_cell, X, initial_state=init_state, time_major=False)
完整代码如下:
import tensorflow as tf
from tensorflow.examples