import tensorflow as tf
# 引入数据集
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data",one_hot = True)
# 输入一行,一行有28个数据
n_inputs = 28
# 一共有28行
max_time = 28
# 隐层单元
lstm_size = 100
# 10个分类
n_classes = 10
# 每批次为50个样本
batch_size = 50
# 计算一共有多少个批次
n_batch = mnist.train.num_examples //batch_size
# None表示第一个维度可以是任意长度
x = tf.placeholder(tf.float32,[None,784])
y = tf.placeholder(tf.float32,[None,10])
# 初始化权值
# tf.truncated_normal正态分布,但如果随机出来的值偏离平均值超过2个标准差,那么这个数将会被重新随机,参数平均值、标准差、取值类型
# [lstm_size,n_classes]表示生成的数据类型stddev表示标准差
weights = tf.Variable(tf.truncated_normal([lstm_size,n_classes],stddev = 0.1))
# 生成常量类型数据
biases = tf.Variable(tf.constant(0.1,shape=[n_classes]))
# 定义RNN网络
def RNN(X,weights,biases):
# x是指批次训练的数据,数据的形式进行转换
# -1表示batch批量的大小,,max_time,n_inputs表征的是batch中每一个数据的基本结构特征,例如x,y,z等。
# 所以dynamic_rnn实现的功能就是可以让不同迭代传入的batch可以是长度不同数据,但同一次迭代一个batch内部的所有数据长度仍然是固定的。
inputs = tf.reshape(X,[-1,max_time,n_inputs])
# 定义LSTM的基本CELL
# 需要传入隐藏层的数量,来计算出结果
# 初始化网络结构模型
# tf.nn.rnn_cell.LSTMCell进行说明,因为是1.2版本的API,所以调用这个方法
lstm_cell = tf.nn.rnn_cell.LSTMCell(lstm_size)
# lstm_cell是指RNNCell的一个实例,inputs表示输入数据,dtypedtype:(可选)初始状态和预期输出的数据类型。
# 如果未提供initial_state或RNN状态具有异构dtype,则为必需。
# sequence_length:(可选)一个int32 / int64矢量大小[batch_size]。表征可以对batch_size进行调节的数据。
# final_state [batch_size, max_time, cell.output_size] 主要是对输出数据特征的表述
# final_state# final_state[0]是cell state表示记忆的状态量。
# final_state[1]是hidden state是状态量。final_state[2]应该是输入的状态量。
# LSTM靠一些“门”的结构让信息有选择性地影响循环神经网络中每个时刻的状态。所谓“门”的结构就是一个使用sigmoid神经网络和一个按位做乘法的操作,
# 这两个操作合在一起就是一个“门”的结构。之所以该结构叫做“门”是因为使用sigmoid作为激活函数的全连接神经网络层会输出一个0到1之间的数值,
# 就是说对于每一个批次,都需要有3个门去控制输入,忘记,输出,三个状态,从而判断这个信号表征这个信号的传递状态。
outputs,final_state = tf.nn.dynamic_rnn(lstm_cell,inputs,dtype=tf.float32)
# 进行计算
# final_state[1]应该是隐藏状态量的图,从而判断是否选择遗忘或者传递
results = tf.nn.softmax(tf.matmul(final_state[1],weights)+biases)
return results
prediction =RNN(x,weights,biases)
# 定义损失函数
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction,labels=y))
# 定义优化器
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
# 计算准确率
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
# 初始化变量
init =tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for epoch in range(6):
for batch in range(n_batch):
# batch_xs表示数据集,batch_ys表示标签集
batch_xs,batch_ys = mnist.train.next_batch(batch_size)
sess.run(train_step,feed_dict = {x:batch_xs,y:batch_ys})
acc = sess.run(accuracy,feed_dict = {x:mnist.test.images,y:mnist.test.labels})
print("Iter "+ str(epoch) +",Testing Accuracy" + str(acc))
赶紧的,新鲜出炉,。。热腾腾的。。哈哈