人工智能A7论坛 >> Tensorflow和深度学习笔记_论坛版 >> 3.Tensorflow第一步 >> 3.2 Demo:Softmax Regression训练MNIST

3.2.1 代码初读

 

'''

A logistic regression learning algorithm example using TensorFlow library.

This example is using the MNIST database of handwritten digits

(http://yann.lecun.com/exdb/mnist/)

 

Author: Aymeric Damien

Project: https://github.com/aymericdamien/TensorFlow-Examples/

'''

 

from __future__ import print_function

 

import tensorflow as tf

 

# Import MNIST data

from tensorflow.examples.tutorials.mnist import input_data

 

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

 

# Parameters

learning_rate = 0.01

思考:learning_rate 一般怎么取?

 

training_epochs = 25

batch_size = 100

思考: batch_size 一般取多少 有什么讲究?

display_step = 1

 

# tf Graph Input

x = tf.placeholder(tf.float32, [None, 784]) # mnist data image of shape 28*28=784

y = tf.placeholder(tf.float32, [None, 10]) # 0-9 digits recognition => 10 classes

# placeholder是一个占位符的概念,告诉tensorflow这块区域被tf.float32类型的变量占了,但是具体是多少,还不能告诉你。

 

# Set model weights

W = tf.Variable(tf.zeros([784, 10]))

b = tf.Variable(tf.zeros([10]))

 

# Construct model

pred = tf.nn.softmax(tf.matmul(x, W) + b) # Softmax

#  tf.nn 提供神经网络相关的一些列支持 如softmax pooling 卷积 激活函数等

#  参考 https://www.tensorflow.org/api_docs/python/tf/nn

#   

 

# Minimize error using cross entropy

cost = tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred), reduction_indices=1))

#  https://www.tensorflow.org/api_guides/python/math_ops#Reduction

#  其实根据官方文档  tf.reduce_mean等价于 numpy.mean 

#  思考:  tf.maximum 和 tf.reduce_max 的区别。前者是往graph中加入一个数学算子,后者是对tensor的值做一个数学计算。

 

# Gradient Descent

optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

 

## 初始化变量

init = tf.global_variables_initializer()

参数的初始化很重要!具体初始化方式见3.2.2

 

启动图 (graph)

with tf.Session() as sess:

    sess.run(init)

 

    # Training cycle

    for epoch in range(training_epochs):

        avg_cost = 0.

        total_batch = int(mnist.train.num_examples/batch_size)

        # Loop over all batches

        for i in range(total_batch):

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

 

            # Run optimization op (backprop) and cost op (to get loss value)

            _, c = sess.run([optimizer, cost], feed_dict={x: batch_xs,

                                               y: batch_ys})

            # feed_dict:将数值传递到计算图的字典

            # 回答三个基本问题  用什么数据训练网络 训练目标是什么 训练方法是什么

            # cost 背后“站着”整个神经网络结构

 

            # Compute average loss

            avg_cost += c / total_batch

        # Display logs per epoch step

        if (epoch+1) % display_step == 0:

            print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(avg_cost))

 

    print("Optimization Finished!")

 

    测试模型  tf.argmax 是从tensorf中寻找最大值的序号

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

 

    # 计算准确率  讲bool型的correct_prediction 转换成float型 然后求平均

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

 

print("Accuracy:", accuracy.eval({x: mnist.test.images, y: mnist.test.labels}))

 

 

 

代码的示意图如下:

 

可以看到 我们实际上构造的是一个没有隐含层、没有激活函数(或者说激活函数是linear)的最浅神经网络。

 

写成矩阵形式: