一、数据集介绍
55000个训练集、10000个测试集、5000个验证集。
手写数字图片28*28像素,从二维结构转化为一维(后面章节使用卷积神经网络会利用空间结构)=784维特征。
0到9共10维label特征。
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)
二、多分类任务算法选择
SoftMax Regression算法原理(略)
简单点说,每个样本都要算10个类的概率,选最高者。 类比到神经网络,是没有隐藏层的最浅的神经网络。
三、四个步骤
1、定义算法公式,也就是神经网络forward时的计算
2、定义loss,选定优化器,并指定优化器优化loss
3、迭代地对数据进行训练
4、在测试集熵对准确率进行评测。
四、代码
import tensorflow as tf
sess = tf.InteractiveSession() #之后的运算默认在这个session里面跑。
# 导入数据集
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)
# 变量初始化
x = tf.placeholder(tf.float32,[None,784])
w = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
y_ = tf.placeholder(tf.float32,[None,10]) # 真实数字类别
# 定义假设函数计算公式,tensorflow会自动计算forward和backward方法。
y = tf.nn.softmax(tf.matmul(x,w)+b)
# 定义损失函数公式 信息熵
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y),reduction_indices = [1]))
# 定义优化算法 SGD学习速率 0.5
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
#参数初始化
tf.global_variables_initializer().run()
#迭代执行训练操作
for i in range(1000): # 迭代次数1000
batch_xs, batch_ys = mnist.train.next_batch(100) # 选全部样本计算量太大,只使用一小部分数据进行随机梯度下降。
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) #评估
accuracy = tf.reduce_mean(tf.cast(correct_prediction,"float")) #将结果转换为浮点数
sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}) #输出
TensorFlow和Spark类似,我们定义的各个公式(cross_entropy、train_step、accuracy)其实只是计算图,在执行代码时,计算还没发生,只有等调用run方法并feed数据时,才真正执行。
虽然准确率有92%,但是线上利用还差的很远。事实上,我们加个隐含层可达98%;引入卷积层、池化层后,可达99%;而目前基于卷积神经网络的state-of-the-art的方法已经可以达到99.8%的正确率。
六、思考
1、数据集支持其他格式吗?或者可以转化为该形式吗?
2、结果输出又是怎么样的呢?