此例程出自《TensorFlow实战Google深度学习框架》6.4.1小节 经典卷积网络模型之LeNet-5模型,具体可搜索“LeNet-5, convolutional neural networks”。 例程中的网络模型与原始LeNet-5模型不太一样,网络结构如下:
INPUT:
[28x28x1] weights: 0
CONV5-32:
[28x28x32] weights: (5*5*1+1)*32
POOL2:
[14x14x32] weights: 0
CONV5-64:
[14x14x64] weights: (5*5*32+1)*64
POOL2:
[7x7x64] weights: 0
FC:
[1x1x512] weights: (7*7*64+1)*512
FC:
[1x1x10] weights: (1*1*512+1)*10
1234567
工程目录:
-
mnist_lenet5
-
dataset //存放数据集的文件夹,可以http://yann.lecun.com/exdb/mnist/下载
-
model //存放模型的文件夹
-
mnist_eval.py //定义了测试过程
-
mnist_inference.py //定义了前向传播的过程以及神经网络中的参数
-
mnist_train.py //定义了神经网络的训练过程
123456
这个和上一篇《TensorFlow最佳实践样例程序》程序是一致的,改动大部分集中在mnist_inference.py前向传播过程。
代码实现
mnist_eval.py
import time
import numpy
as np
import tensorflow
as tf
from tensorflow.examples.tutorials.mnist
import input_data
import mnist_inference
import mnist_train
EVAL_INTERVAL_SECS =
10
def evaluate(mnist):
with tf.Graph().as_default()
as g:
x = tf.placeholder(tf.float32, [
mnist.validation.num_examples,
mnist_inference.IMAGE_SIZE,
mnist_inference.IMAGE_SIZE,
mnist_inference.NUM_CHANNELS],
name=
'x-input')
y_ = tf.placeholder(tf.float32, [
None, mnist_inference.OUTPUT_NODE], name=
'y-input')
validate_feed = {x: np.reshape(mnist.validation.images, (mnist.validation.num_examples, mnist_inference.IMAGE_SIZE, mnist_inference.IMAGE_SIZE, mnist_inference.NUM_CHANNELS)),
y_: mnist.validation.labels}
y = mnist_inference.inference(x,
False,
None)
correct_prediction = tf.equal(tf.argmax(y,
1), tf.argmax(y_,
1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
variable_averages = tf.train.ExponentialMovingAverage(mnist_train.MOVING_AVERAGE_DECAY)
variable_to_restore = variable_averages.variables_to_restore()
saver = tf.train.Saver(variable_to_restore)
while True:
with tf.Session()
as sess:
ckpt = tf.train.get_checkpoint_state(mnist_train.MODEL_SAVE_PATH)
if ckpt
and ckpt.model_checkpoint_path:
saver.restore(sess, ckpt.model_checkpoint_path)
global_step = ckpt.model_checkpoint_path.split(
'/')[-
1].split(
'-')[-
1]
accuracy_score = sess.run(accuracy, feed_dict = validate_feed)
print(
"After %s training step(s), validation accuracy = %f" % (global_step, accuracy_score))
else:
print(
"No checkpoint file found")
return
time.sleep(EVAL_INTERVAL_SECS)
def main(argv=None):
mnist = input_data.read_data_sets(
"dataset/", one_hot=
True)
evaluate(mnist)
if __name__ ==
'__main__':
tf.app.run()
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
mnist_inference.py
import tensorflow
as tf
INPUT_NODE =
784
OUTPUT_NODE =
10
LAYER1_NODE =
500
IMAGE_SIZE =
28
NUM_CHANNELS =
1
NUM_LABELS =
10
CONV1_DEEP =
32
CONV1_SIZE =
5
CONV2_DEEP =
64
CONV2_SIZE =
5
FC_SIZE =
512
def inference(input_tensor, train, regularizer):
with tf.variable_scope(
'layer1-conv1'):
conv1_weights = tf.get_variable(
"weight", [CONV1_SIZE, CONV1_SIZE, NUM_CHANNELS, CONV1_DEEP],
initializer = tf.truncated_normal_initializer(stddev=
0.1)
)
conv1_biases = tf.get_variable(
"bias", [CONV1_DEEP], initializer=tf.constant_initializer(
0.0))
conv1 = tf.nn.conv2d(input_tensor, conv1_weights, strides=[
1,
1,
1,
1], padding=
'SAME')
relu1 = tf.nn.relu(tf.nn.bias_add(conv1, conv1_biases))
with tf.name_scope(
'layer2-pool'):
pool1 = tf.nn.max_pool(relu1, ksize=[
1,
2,
2,
1], strides=[
1,
2,
2,
1], padding=
'SAME')
with tf.variable_scope(
'layer3-conv2'):
conv2_weights = tf.get_variable(
"weight", [CONV2_SIZE, CONV2_SIZE, CONV1_DEEP, CONV2_DEEP],
initializer = tf.truncated_normal_initializer(stddev=
0.1)
)
conv2_biases = tf.get_variable(
"bias", [CONV2_DEEP], initializer=tf.constant_initializer(
0.0))
conv2 = tf.nn.conv2d(pool1, conv2_weights, strides=[
1,
1,
1,
1], padding=
'SAME')
relu2 = tf.nn.relu(tf.nn.bias_add(conv2, conv2_biases))
with tf.name_scope(
'layer4-poo2'):
pool2 = tf.nn.max_pool(relu2, ksize=[
1,
2,
2,
1], strides=[
1,
2,
2,
1], padding=
'SAME')
pool_shape = pool2.get_shape().as_list()
nodes = pool_shape[
1] * pool_shape[
2] * pool_shape[
3]
reshaped = tf.reshape(pool2, [pool_shape[
0], nodes])
with tf.variable_scope(
'layer5-fc1'):
fc1_weights = tf.get_variable(
"weight", [nodes, FC_SIZE],
initializer = tf.truncated_normal_initializer(stddev =
0.1))
if regularizer !=
None:
tf.add_to_collection(
'losses', regularizer(fc1_weights))
fc1_biases = tf.get_variable(
'bias', [FC_SIZE], initializer = tf.constant_initializer(
0.1))
fc1 = tf.nn.relu(tf.matmul(reshaped, fc1_weights)+fc1_biases)
if train:
fc1 = tf.nn.dropout(fc1,
0.5)
with tf.variable_scope(
'layer6-fc2'):
fc2_weights = tf.get_variable(
"weight", [FC_SIZE, NUM_LABELS],
initializer = tf.truncated_normal_initializer(stddev =
0.1))
if regularizer !=
None:
tf.add_to_collection(
'losses', regularizer(fc2_weights))
fc2_biases = tf.get_variable(
'bias', [NUM_LABELS], initializer = tf.constant_initializer(
0.1))
logit = tf.matmul(fc1, fc2_weights) + fc2_biases
return logit
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
mmnist_train.py
import os
import numpy
as np
import tensorflow
as tf
from tensorflow.examples.tutorials.mnist
import input_data
import mnist_inference
BATCH_SIZE =
100
LEARNING_RATE_BASE =
0.01
LEARNING_RATE_DECAY =
0.99
REGULARAZTION_RATE =
0.0001
TRAINING_STEPS =
30000
MOVING_AVERAGE_DECAY =
0.99
MODEL_SAVE_PATH =
"model/"
MODEL_NAME =
"model.ckpt"
def train(mnist):
x = tf.placeholder(tf.float32, [
BATCH_SIZE,
mnist_inference.IMAGE_SIZE,
mnist_inference.IMAGE_SIZE,
mnist_inference.NUM_CHANNELS],
name=
'x-input')
y_ = tf.placeholder(tf.float32, [
None, mnist_inference.OUTPUT_NODE], name=
'y-input')
regularizer = tf.contrib.layers.l2_regularizer(REGULARAZTION_RATE)
y = mnist_inference.inference(x,
True, regularizer)
global_step = tf.Variable(
0, trainable=
False)
variable_averages = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step)
variable_averages_op = variable_averages.apply(tf.trainable_variables())
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=tf.argmax(y_,
1))
cross_entropy_mean = tf.reduce_mean(cross_entropy)
loss = cross_entropy_mean + tf.add_n(tf.get_collection(
'losses'))
learning_rate = tf.train.exponential_decay(LEARNING_RATE_BASE, global_step, mnist.train.num_examples/BATCH_SIZE, LEARNING_RATE_DECAY)
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_step)
with tf.control_dependencies([train_step, variable_averages_op]):
train_op = tf.no_op(name=
'train')
saver = tf.train.Saver()
with tf.Session()
as sess:
tf.global_variables_initializer().run()
for i
in range(TRAINING_STEPS):
xs, ys = mnist.train.next_batch(BATCH_SIZE)
reshaped_xs = np.reshape(xs, (BATCH_SIZE, mnist_inference.IMAGE_SIZE, mnist_inference.IMAGE_SIZE, mnist_inference.NUM_CHANNELS))
_, loss_value, step = sess.run([train_op, loss, global_step], feed_dict={x: reshaped_xs, y_: ys})
if i%
1000 ==
0:
print(
"After %d training step(s), loss on training batch is %f." % (step, loss_value))
saver.save(sess, os.path.join(MODEL_SAVE_PATH, MODEL_NAME), global_step=global_step)
def main(argv=None):
mnist = input_data.read_data_sets(
"dataset/", one_hot=
True)
train(mnist)
if __name__ ==
'__main__':
tf.app.run()
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
实验及分析
由于是在上一个程序TensorFlow最佳实践样例程序 修改的,刚开始只是使用了它的学习率LEARNING_RATE_BASE = 0.8。 训练过程: 测试结果: 可以明显看出不收敛,准确率跟瞎猜差不多。对上述结果分析原因:可能学习率太高。将其改为0.01。 训练过程: 测试结果: 准确率99.04%,符合预期。
<link rel="stylesheet" href="http://csdnimg.cn/release/phoenix/production/markdown_views-0bc64ada25.css">
</div>