版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wspba/article/details/54097760
教程地址:TensorFlow官方文档中文版
MNIST数据集是一个手写数字图像的数据集,包含了60000个训练样本和10000个测试样本,每个样本的维度是784(28*28),样本的值代表图像的灰度值,值的范围为0~1,每个样本对应一个标签,标签是一个长度为10的向量,向量中对应数字真值的位置为1,其余为0。
教程中给了MNIST数据集下载和提取的代码:
import tensorflow.examples.tutorials.mnist.input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
但是在运行时会报错,网上有人说替换成一下代码可以解决问题:
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
但是下载的数据集并不是存放在\tutorials\mnist\的目录下,并且我觉得下载的速度太慢了,所以我的建议是,自行从官网上下载mnist数据集,一共包含四个后缀是gz的文件,然后在\tutorials\mnist\目录下创建一个名为MNIST_data的文件夹,将数据放到这个文件中,然后在Python中cd到\tutorials\mnist\的目录下,使用以下代码:
import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
然后我们就可以使用这些数据来训练、测试和验证模型。
教程中使用了softmax回归模型,softmax的具体内容在教程中讲的很详细,在此也不再赘述。
在构建好回归模型后,就可以用TensorFlow来实现这个模型的训练:
import tensorflow as tf
x = tf.placeholder(tf.float32, [None, 784]) #构建占位符,代表输入的图像,None表示样本的数量可以是任意的
W = tf.Variable(tf.zeros([784,10])) #构建一个变量,代表训练目标W,初始化为0
b = tf.Variable(tf.zeros([10])) #构建一个变量,代表训练目标b,初始化为0
y = tf.nn.softmax(tf.matmul(x,W) + b) #构建了一个softmax的模型:y = softmax(Wx + b),y指样本标签的预测值
y_ = tf.placeholder("float", [None,10]) #构建占位符,代表样本标签的真实值
cross_entropy = -tf.reduce_sum(y_*tf.log(y)) #交叉熵代价函数
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) #使用梯度下降法(0.01的学习率)来最小化这个交叉熵代价函数
init = tf.initialize_all_variables()
sess = tf.Session() #构建会话
sess.run(init) #初始化所有变量
for i in range(1000): #迭代次数为1000
batch_xs, batch_ys = mnist.train.next_batch(100) #使用minibatch的训练数据,一个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)) #tf.argmax()返回的是某一维度上其数据最大所在的索引值,在这里即代表预测值和真值
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) #用平均值来统计测试准确率
print i, sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}) #打印测试信息
sess.close()
在我的电脑上运行的结果为:
最终的测试准确率在91%左右。
总的来说,TensorFlow的运行方式还是很简单明了:构建一个模型,选择一个代价函数,将训练数据传给占位符并使用优化算法最小化代价函数来不断迭代更新Variable,这就是一个基本的训练过程,在训练过程中以及训练结束后我们都可以对训练的效果来进行评估。