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>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容