TensorFlow技术解析与实战 9.5 RNN

# -*- coding:utf-8 -*-

import sys

import importlib

importlib.reload(sys)

from tensorflow.examples.tutorials.mnist import input_data

import tensorflow as tf

# 加载数据

mnist = input_data.read_data_sets("./", one_hot=True)

trX, trY, teX, teY = mnist.train.images, mnist.train.labels, mnist.test.images, mnist.test.labels

trX = trX.reshape(-1, 28, 28, 1)  # 28x28x1 input img

teX = teX.reshape(-1, 28, 28, 1)  # 28x28x1 input img

# 设置训练的超参数

lr = 0.001

training_iters = 100000

batch_size = 128

# 神经网络的参数

n_inputs = 28    # 输入层的n

n_steps = 28    # 28长度

n_hidden_units = 128    # 隐藏层的神经元个数

n_classes = 10  # 输出的数量,即分类的类别,0~9个数字,共有10个

# 输入数据占位符

x = tf.placeholder("float", [None, n_steps, n_inputs])

y = tf.placeholder("float", [None, n_classes])

# 定义权重

weights = {

'in': tf.Variable(tf.random_normal([n_inputs, n_hidden_units])),

'out': tf.Variable(tf.random_normal([n_hidden_units, n_classes]))

}

biases = {

'in': tf.Variable(tf.constant(0.1, shape=[n_hidden_units, ])),

'out': tf.Variable(tf.constant(0.1, shape=[n_classes, ]))

}

#定义RNN模型

def RNN(X, weights, biases):

X = tf.reshape(X, [-1, n_inputs])  #把输入的X转换成X ==》(128 batch * 28 steps, 28 inputs)

# 进入隐藏层

X_in = tf.matmul(X, weights['in']) + biases['in']  # (128 batch * 28 steps, 128 hidden)

X_in = tf.reshape(X_in, [-1, n_steps, n_hidden_units])  # 128 batch , 28 steps, 128 hidden

# 这里采用基本的LSTM循环网络单元:basic LSTM Cell

lstm_cell = tf.contrib.rnn.BasicLSTMCell(n_hidden_units, forget_bias=1.0, state_is_tuple=True)

init_state = lstm_cell.zero_state(batch_size, dtype=tf.float32) #lstm单元由两个部分组成:(c_state, h_state)

# dynamic_rnn接收张量(batch, steps, inputs)或者(steps, batch, inputs)作为X_in

outputs, final_state = tf.nn.dynamic_rnn(lstm_cell, X_in, initial_state=init_state, time_major=False)

results = tf.matmul(final_state[1], weights['out']) + biases['out']

return results

# 定义损失函数和优化器,优化器采用AdamOptimizer

pred = RNN(x, weights, biases)

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y))

train_op = tf.train.AdamOptimizer(lr).minimize(cost)

# 定义模型预测结果及准确率计算方法

correct_pred = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))

accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))

# 训练数据及评估模型

with tf.Session() as sess:

sess.run(tf.global_variables_initializer())

step = 0

while step * batch_size < training_iters:

batch_xs, batch_ys = mnist.train.next_batch(batch_size)

batch_xs = batch_xs.reshape([batch_size, n_steps, n_inputs])

sess.run([train_op], feed_dict={x:batch_xs, y:batch_ys,})

if step % 20 == 0:

print(sess.run(accuracy, feed_dict={x:batch_xs, y:batch_ys,}))

step += 1



0.2578125

0.671875

0.7578125

0.8203125

0.8984375

0.9296875

0.9140625

0.90625

0.875

0.9296875

0.9453125

0.9296875

0.9609375

0.921875

0.9296875

0.9609375

0.9453125

0.890625

0.9296875

0.9375

0.953125

0.9765625

0.9375

0.9375

0.9609375

0.9609375

0.96875

0.9609375

0.96875

0.9609375

0.96875

0.9453125

0.9609375

0.9921875

0.9765625

0.9765625

0.9765625

0.96875

0.953125

0.9765625

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容