1 # -*- coding=UTF8 -*- 2 #author = Lee 3 4 import tensorflow as tf 5 from tensorflow.examples.tutorials.mnist import input_data 6 7 mnist = input_data.read_data_sets('mnist', one_hot=True) 8 9 #输入数据,权重,偏差 10 input_x = tf.placeholder(tf.float32, shape = [None, 28 * 28]) 11 y_actual = tf.placeholder(tf.float32, shape = [None, 1 * 10]) #实际值 12 W = tf.Variable(tf.zeros([784, 10])) 13 b = tf.Variable(tf.zeros([10])) 14 15 #从测试Test数据集中选取3000个手写数字的图片和对应的标签 16 test_x = mnist.test.images[:3000] # 图片 17 test_y = mnist.test.labels[:3000] # 标签 18 19 20 y_predict = tf.nn.softmax(tf.matmul(input_x, W) + b) #预测值 21 22 #交叉熵是用来衡量我们的预测用于描述真相的低效性 23 cross_entropy = - tf.reduce_sum(y_actual * tf.log(y_predict)) 24 25 #使用梯度下降算法(GradientDescent)来不断地修改变量以降低成本 26 train_op = tf.train.GradientDescentOptimizer(learning_rate = 0.01).minimize(cross_entropy) 27 28 init = tf.global_variables_initializer() 29 30 #检测预测是否真实标签匹配(索引位置一样表示匹配) 31 correc_predic = tf.equal(tf.argmax(y_actual, 1), tf.argmax(y_predict, 1)) 32 accuracy = tf.reduce_mean(tf.cast(correc_predic, "float32")) 33 34 sess = tf.Session() 35 sess.run(init) 36 37 for i in range(20000): 38 batch = mnist.train.next_batch(50) 39 train_loss, train_op_ = sess.run([cross_entropy, train_op], {input_x: batch[0], y_actual: batch[1]}) 40 if i % 100 == 0: 41 accuracy_test = sess.run(accuracy, {input_x: test_x, y_actual: test_y}) 42 print('Step:{0} , Accuracy:{1} , Loss:{2}'.format(i, accuracy_test,train_loss))
相对CNN来说NN还是相对简单许多,这里是官网给的流程图
专门去TF社区看了下,专门对softmax有很详细的讲解
softmax可以看成是一个激励(activation)函数或者链接(link)函数,把我们定义的线性函数的输出转换成我们想要的格式,也就是关于10个数字类的概率分布。
因此,给定一张图片,它对于每一个数字的吻合度可以被softmax函数转换成为一个概率值。