# coding=utf-8
'''
Created on Feb 9, 2019
@author: zhongzhu
'''
import math
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
# MNIST 有10个类, 表达了0到9的10个数字.
NUM_CLASSES = 10
# MNIST 中的图像都是 28x28 像素,展开成784维的特征向量
IMAGE_SIZE = 28
IMAGE_PIXELS = IMAGE_SIZE * IMAGE_SIZE
batch_size = 50 #每个批次的样本数量
hidden1_units = 20 #第一个隐藏层的大小.
hidden2_units = 15 #第二个隐藏层的大小.
learning_rate = 0.1 #优化器的学习率
#构建学习器模型的前向预测过程(从输入到预测输出的计算图路径)
def inference(images, hidden1_units, hidden2_units):
# Hidden 1:y1 = relu(x*W1 +b1)
with tf.name_scope('hidden1'):
weights = tf.Variable(
tf.truncated_normal([IMAGE_PIXELS, hidden1_units],
stddev=1.0 / math.sqrt(float(IMAGE_PIXELS))),
name='weights')
biases = tf.Variable(tf.zeros([hidden1_units]), name='biases')
hidden1 = tf.nn.relu(tf.matmul(images, weights) + biases)
# Hidden 2: y2 = relu(y1*W2 + b2)
with tf.name_scope('hidden2'):
weights = tf.Variable(
tf.truncated_normal([hidden1_units, hidden2_units],
stddev=1.0 / math.sqrt(float(hidden1_units))),
name='weights')
biases = tf.Variable(tf.zeros([hidden2_units]), name='biases')
hidden2 = tf.nn.relu(tf.matmul(hidden1, weights) + biases)
# Linear: logits = y2*W3 + b3
with tf.name_scope('softmax_linear'):
weights = tf.Variable(
tf.truncated_normal([hidden2_units, NUM_CLASSES],
stddev=1.0 / math.sqrt(float(hidden2_units))),
name='weights')
biases = tf.Variable(tf.zeros([NUM_CLASSES]), name='biases')
logits = tf.matmul(hidden2, weights) + biases
return logits
#根据logits和labels计算输出层损失。
def loss(logits, labels):
labels = tf.to_int64(labels)
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
labels=labels, logits=logits, name='xentropy')
return tf.reduce_mean(cross_entropy, name='xentropy_mean')
#为损失模型添加训练节点(需要产生和应用梯度的节点)
def training(loss, learning_rate):
# 为保存loss的值添加一个标量汇总(scalar summary).
tf.summary.scalar('loss', loss)
# 根据给定的学习率创建梯度下降优化器
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
# 创建一个变量来跟踪global step.
global_step = tf.Variable(0, name='global_step', trainable=False)
# 在训练节点,使用optimizer将梯度下降法应用到可调参数上来最小化损失
# (同时不断增加 global step 计数器) .
train_op = optimizer.minimize(loss=loss,global_step=global_step)
return train_op
#评估模型输出的logits在预测类标签方面的质量
def evaluation(logits, labels):
correct = tf.nn.in_top_k(logits, labels, 1)
# 返回 当前批次的样本中预测正确的样本数量.
return tf.reduce_sum(tf.cast(correct, tf.int32))
if __name__ == '__main__':
with tf.Graph().as_default():
X = tf.placeholder(tf.float32, shape=(batch_size, IMAGE_PIXELS), name = 'X')
Y_true = tf.placeholder(tf.int32, shape=(batch_size), name='Y_true')
# Inference 双隐藏层前向推导
with tf.name_scope('Inference'):
logits = inference(X,hidden1_units, hidden2_units)
# Loss计算
with tf.name_scope('Loss'):
batch_loss = loss(logits=logits, labels=Y_true)
# Train数据
with tf.name_scope('Train'):
train_on_batch = training(loss=batch_loss, learning_rate=learning_rate)
# AccuracyCount Evaluate
with tf.name_scope('Evaluate'):
correct_counts = evaluation(logits=logits, labels=Y_true)
InitOp = tf.global_variables_initializer()
print('开始运行计算图')
mnist = input_data.read_data_sets('MNIST_data/', one_hot=False)
#声明一个交互式会话
sess = tf.InteractiveSession()
sess.run(InitOp)
# 开始批次训练, 总共训练1000个批次,每个批次100个样本
for step in range(2000):
batch_xs, batch_ys = mnist.train.next_batch(batch_size)
#将当前批次的样本喂给计算图中的输入占位符,启动训练节点开启训练
_logits, _batch_loss, _train_on_batch = sess.run([logits,batch_loss,train_on_batch], feed_dict={X: batch_xs, Y_true: batch_ys})
print("train step: ", step, ", batch_loss: ", _batch_loss)
pred_count = int(len(mnist.test.images)/batch_size)
print("pred_count",pred_count)
for i in range(pred_count):
print("第",(i+1),"次预测")
test_batch_xs, test_batch_ys = mnist.test.next_batch(batch_size)
_correct_counts = sess.run(correct_counts, feed_dict={X:test_batch_xs, Y_true: test_batch_ys})
print("模型准确率", float(_correct_counts)/batch_size)
##调用Summary.FileWriter写入计算图
writer = tf.summary.FileWriter("logs", tf.get_default_graph())
writer.close()
程序输出如下,
pred_count 200
第 1 次预测
模型准确率 0.92
第 2 次预测
模型准确率 0.94
第 3 次预测
模型准确率 0.92
第 4 次预测
模型准确率 0.94
第 5 次预测
模型准确率 0.92
第 6 次预测
模型准确率 0.94
第 7 次预测
模型准确率 0.94
第 8 次预测
模型准确率 0.98
第 9 次预测
模型准确率 0.92
第 10 次预测
模型准确率 1.0
第 11 次预测
模型准确率 0.98
第 12 次预测
模型准确率 0.88
第 13 次预测
模型准确率 0.94
第 14 次预测
模型准确率 0.92
第 15 次预测
模型准确率 0.88
第 16 次预测
模型准确率 1.0
第 17 次预测
模型准确率 0.92
第 18 次预测
模型准确率 0.94
第 19 次预测
模型准确率 0.9
第 20 次预测
模型准确率 0.94
第 21 次预测
模型准确率 0.94
第 22 次预测
模型准确率 0.98
第 23 次预测
模型准确率 0.98
第 24 次预测
模型准确率 0.94
第 25 次预测
模型准确率 0.96
第 26 次预测
模型准确率 0.98
第 27 次预测
模型准确率 0.96
第 28 次预测
模型准确率 0.94
第 29 次预测
模型准确率 1.0
第 30 次预测
模型准确率 1.0
第 31 次预测
模型准确率 0.92
第 32 次预测
模型准确率 0.96
第 33 次预测
模型准确率 0.94
第 34 次预测
模型准确率 0.98
第 35 次预测
模型准确率 0.96
第 36 次预测
模型准确率 0.92
第 37 次预测
模型准确率 0.94
第 38 次预测
模型准确率 0.94
第 39 次预测
模型准确率 0.96
第 40 次预测
模型准确率 0.9
第 41 次预测
模型准确率 0.96
第 42 次预测
模型准确率 0.9
第 43 次预测
模型准确率 0.94
第 44 次预测
模型准确率 0.96
第 45 次预测
模型准确率 0.94
第 46 次预测
模型准确率 0.98
第 47 次预测
模型准确率 0.96
第 48 次预测
模型准确率 0.96
第 49 次预测
模型准确率 0.94
第 50 次预测
模型准确率 1.0
第 51 次预测
模型准确率 0.9
第 52 次预测
模型准确率 0.96
第 53 次预测
模型准确率 0.9
第 54 次预测
模型准确率 0.96
第 55 次预测
模型准确率 0.9
第 56 次预测
模型准确率 0.9
第 57 次预测
模型准确率 0.96
第 58 次预测
模型准确率 0.82
第 59 次预测
模型准确率 0.96
第 60 次预测
模型准确率 0.88
第 61 次预测
模型准确率 0.94
第 62 次预测
模型准确率 0.92
第 63 次预测
模型准确率 0.94
第 64 次预测
模型准确率 0.94
第 65 次预测
模型准确率 0.92
第 66 次预测
模型准确率 0.96
第 67 次预测
模型准确率 0.96
第 68 次预测
模型准确率 0.94
第 69 次预测
模型准确率 0.96
第 70 次预测
模型准确率 0.9
第 71 次预测
模型准确率 0.94
第 72 次预测
模型准确率 0.96
第 73 次预测
模型准确率 0.9
第 74 次预测
模型准确率 0.88
第 75 次预测
模型准确率 0.96
第 76 次预测
模型准确率 0.9
第 77 次预测
模型准确率 1.0
第 78 次预测
模型准确率 0.92
第 79 次预测
模型准确率 0.96
第 80 次预测
模型准确率 1.0
第 81 次预测
模型准确率 0.92
第 82 次预测
模型准确率 0.98
第 83 次预测
模型准确率 0.88
第 84 次预测
模型准确率 0.96
第 85 次预测
模型准确率 0.92
第 86 次预测
模型准确率 0.96
第 87 次预测
模型准确率 0.98
第 88 次预测
模型准确率 0.98
第 89 次预测
模型准确率 0.96
第 90 次预测
模型准确率 0.9
第 91 次预测
模型准确率 0.94
第 92 次预测
模型准确率 0.94
第 93 次预测
模型准确率 0.96
第 94 次预测
模型准确率 0.88
第 95 次预测
模型准确率 1.0
第 96 次预测
模型准确率 0.94
第 97 次预测
模型准确率 0.96
第 98 次预测
模型准确率 0.88
第 99 次预测
模型准确率 0.98
第 100 次预测
模型准确率 0.98
第 101 次预测
模型准确率 0.98
第 102 次预测
模型准确率 0.92
第 103 次预测
模型准确率 1.0
第 104 次预测
模型准确率 0.98
第 105 次预测
模型准确率 0.96
第 106 次预测
模型准确率 0.92
第 107 次预测
模型准确率 0.96
第 108 次预测
模型准确率 0.92
第 109 次预测
模型准确率 1.0
第 110 次预测
模型准确率 0.92
第 111 次预测
模型准确率 0.96
第 112 次预测
模型准确率 0.98
第 113 次预测
模型准确率 0.98
第 114 次预测
模型准确率 0.96
第 115 次预测
模型准确率 0.98
第 116 次预测
模型准确率 0.98
第 117 次预测
模型准确率 0.94
第 118 次预测
模型准确率 0.9
第 119 次预测
模型准确率 0.94
第 120 次预测
模型准确率 0.94
第 121 次预测
模型准确率 0.96
第 122 次预测
模型准确率 0.88
第 123 次预测
模型准确率 0.98
第 124 次预测
模型准确率 0.94
第 125 次预测
模型准确率 1.0
第 126 次预测
模型准确率 0.92
第 127 次预测
模型准确率 0.98
第 128 次预测
模型准确率 0.94
第 129 次预测
模型准确率 0.96
第 130 次预测
模型准确率 0.92
第 131 次预测
模型准确率 0.92
第 132 次预测
模型准确率 0.96
第 133 次预测
模型准确率 0.88
第 134 次预测
模型准确率 0.96
第 135 次预测
模型准确率 0.92
第 136 次预测
模型准确率 0.92
第 137 次预测
模型准确率 0.96
第 138 次预测
模型准确率 0.92
第 139 次预测
模型准确率 0.96
第 140 次预测
模型准确率 0.96
第 141 次预测
模型准确率 0.96
第 142 次预测
模型准确率 0.92
第 143 次预测
模型准确率 0.98
第 144 次预测
模型准确率 0.94
第 145 次预测
模型准确率 0.92
第 146 次预测
模型准确率 0.94
第 147 次预测
模型准确率 0.94
第 148 次预测
模型准确率 0.96
第 149 次预测
模型准确率 0.96
第 150 次预测
模型准确率 0.9
第 151 次预测
模型准确率 0.94
第 152 次预测
模型准确率 0.94
第 153 次预测
模型准确率 0.92
第 154 次预测
模型准确率 0.94
第 155 次预测
模型准确率 0.94
第 156 次预测
模型准确率 0.98
第 157 次预测
模型准确率 0.96
第 158 次预测
模型准确率 0.94
第 159 次预测
模型准确率 0.96
第 160 次预测
模型准确率 0.92
第 161 次预测
模型准确率 0.9
第 162 次预测
模型准确率 0.86
第 163 次预测
模型准确率 0.96
第 164 次预测
模型准确率 0.86
第 165 次预测
模型准确率 0.98
第 166 次预测
模型准确率 0.96
第 167 次预测
模型准确率 0.88
第 168 次预测
模型准确率 0.96
第 169 次预测
模型准确率 0.98
第 170 次预测
模型准确率 0.96
第 171 次预测
模型准确率 0.96
第 172 次预测
模型准确率 0.92
第 173 次预测
模型准确率 0.98
第 174 次预测
模型准确率 0.94
第 175 次预测
模型准确率 0.94
第 176 次预测
模型准确率 0.9
第 177 次预测
模型准确率 0.86
第 178 次预测
模型准确率 0.96
第 179 次预测
模型准确率 0.96
第 180 次预测
模型准确率 0.92
第 181 次预测
模型准确率 0.98
第 182 次预测
模型准确率 0.94
第 183 次预测
模型准确率 0.94
第 184 次预测
模型准确率 0.98
第 185 次预测
模型准确率 0.96
第 186 次预测
模型准确率 0.96
第 187 次预测
模型准确率 0.92
第 188 次预测
模型准确率 1.0
第 189 次预测
模型准确率 0.9
第 190 次预测
模型准确率 0.94
第 191 次预测
模型准确率 0.86
第 192 次预测
模型准确率 0.98
第 193 次预测
模型准确率 0.9
第 194 次预测
模型准确率 0.94
第 195 次预测
模型准确率 0.94
第 196 次预测
模型准确率 0.94
第 197 次预测
模型准确率 0.9
第 198 次预测
模型准确率 0.9
第 199 次预测
模型准确率 0.92
第 200 次预测
模型准确率 0.94
D:\tensorflow\multi_hidden_layer>