Tensorflow实现两个隐藏层的softmax分类器(附测试代码)

# 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>

你可能感兴趣的:(Tensorflow实现两个隐藏层的softmax分类器(附测试代码))