tensorflow入门之MINIST手写数字识别

最近在学tensorflow,看了很多资料以及相关视频,有没有大佬推荐一下比较好的教程之类的,谢谢。最后还是到了官方网站去,还好有官方文档中文版,今天就结合官方文档以及之前看的教程写一篇关于MINIST手写数字识别,小白一枚,不足之处还请大家多多见谅。

tensorflow的安装

这个确实是个问题,很多人用tensorflow1.0,当然也有人用tensorflow2.0。为了避免这个问题,我装了两个版本(有一个小问题就是tensorboard只能用2.0版本的,但是能访问是空白,有大佬知道解决方法的希望指点一下)。如果你想安装2.0版本的,直接使用pip命令即可,不过pip好像默认安装的是GPU版本的,大家要注意一下。另外如果2.0版本安装成功但是导入失败了,欢迎参考我的另一篇博客《解决PyCharm安装tensorflow-cpu2.1.0导入失败问题》。如果使用1.0版本的,你也可以直接使用pip安装,只是要在后面加上版本号,比如:

pip install tensorflow==1.12.0

当然你也可以使用pycharm安装,只是安装的时候选择特定版本即可。
勾选specify version,在右边选择即可

MINIST数据的下载

要做MINIST手写数字识别,首先我们需要下载MINIST数据集,大家可以自行到其官网下载,官网下载链接附上嫌麻烦的也可以直接下载我打包好的。它包含了四个部分:训练集、训练集标签、测试集、测试集标签。
在这里插入图片描述
MNIST 中的每个图像都具有相应的标签,0 到 9 之间的数字表示图像中绘制的数字,用的是 one-hot 编码 nn[0,0,0,0,0,0,1,0,0,0],mnist.train.labels[55000,10]。

代码编写

直接下载下来的数据是无法通过解压或者应用程序打开的,因为这些文件不是任何标准的图像格式而是以字节的形式进行存储的,所以必须编写程序来打开它。

mnist = input_data.read_data_sets('E:\\MNIST_DATA',one_hot=True)
#第一个参数指的是存放数据的文件夹路径,one_hot=True 为采用 one_hot 的编码方式编码标签

下载下来的数据集被分成两部分:60000行的训练数据集(mnist.train)和10000行的测试数据集(mnist.test)。这样的切分很重要,在机器学习模型设计时必须有一个单独的测试数据集不用于训练而是用来评估这个模型的性能,从而更加容易把设计的模型推广到其他数据集上(泛化)。
我们知道MNIST的每一张图片都表示一个数字,从0到9。我们希望得到给定图片代表每个数字的概率。比如说,我们的模型可能推测一张包含9的图片代表数字9的概率是80%但是判断它是8的概率是5%(因为8和9都有上半部分的小圆),然后给予它代表其他数字的概率更小的值。
这是一个使用softmax回归(softmax regression)模型的经典案例。softmax模型可以用来给不同的对象分配概率。即使在之后,我们训练更加精细的模型时,最后一步也需要用softmax来分配概率。有关softmax模型的详细介绍欢迎大家移步tensorflow官网,接下来附上完整代码。

from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
def mnist_test():
    mnist = input_data.read_data_sets('e:/soft/MNIST_DATA',one_hot=True)
    images,labels = mnist.train.next_batch(100)
    x = tf.placeholder(dtype=tf.float32,shape=[None,784])
    y_true = tf.placeholder(dtype=tf.float32,shape=[None,10])
    weight = tf.Variable(initial_value=tf.random_normal(shape=[784,10]))
    bias = tf.Variable(initial_value=tf.random_normal(shape=[10]))
    y_predict = tf.matmul(x,weight) +bias
    error = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true,logits=y_predict))
    optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(error)
    init = tf.global_variables_initializer()
    with tf.Session() as sess:
        sess.run(init)
        print('训练模型前的损失:%f'%(sess.run(error,feed_dict={x:images,y_true:labels})))
        for i in range(1000):
            op,loss = sess.run([optimizer,error],feed_dict={x:images,y_true:labels})
            print('第%d次训练模型的损失:%f'%((i+1),loss))
if __name__ == '__main__':
    mnist_test()
发布了11 篇原创文章 · 获赞 0 · 访问量 1171

猜你喜欢

转载自blog.csdn.net/xiyangxia666hui/article/details/105353941
今日推荐