一篇就懂 tensorflow入门 MNIST数据处理(介绍,提高,入门的常见问题解决汇总)(超详细)

tensorflow入门 MNIST数据处理(介绍,提高,入门的常见问题解决汇总)(超详细)

前言

自己学tensorflow刚开始还是挺不舒服的,各种不理解,各种错误,不过熬过去就好了。结果这么长时间都没有写博客记录,于是便整理了一下,就有了这篇文章,一方面为了刚入门的小白,另一方面也帮自己总结一下。这篇文章我会写的很细,希望能解决你用tensorflow入门处理MNIST数据的困难。(希望)话不多说,我们开始吧。

介绍

MNIST 是一个非常有名的手写体数字识别数据集,在很多资料中,这个数据集都会被用作深度学习的入门样例。(之前笔者学sklearn的时候,也用这个数据集做过处理,真的是很经典。)
这个数据集长什么样呢?
MNIST_data
其中
Training set images(训练集图片): train-images-idx3-ubyte.gz (9.9 MB, 解压后 47 MB, 包含 60,000 个样本)
Training set label(训练集标签)s: train-labels-idx1-ubyte.gz (29 KB, 解压后 60 KB, 包含 60,000 个标签)
Test set images(测试集图片): t10k-images-idx3-ubyte.gz (1.6 MB, 解压后 7.8 MB, 包含 10,000 个样本)
Test set labels(测试集标签): t10k-labels-idx1-ubyte.gz (5KB, 解压后 10 KB, 包含 10,000 个标签)

简单实现

如果哪一步出错了,就到最后的常见问题里去找对应的解决方案就行。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon Mar  2 12:24:27 2020

@author: phoenix
"""

#import相关的库,这一步失败,在常见问题1处有解决方案
#import tensorflow as tf
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
from tensorflow.examples.tutorials.mnist import input_data
"""
tensorflow如果是1.0的版本,那么直接import tensorflow as tf
如果是2.0之后的,那么需要
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
"""

#2.载入数据集,MNIST_data前面是我的路径,这一步失败,在常见问题2处有解决方案
mnist = input_data.read_data_sets("/Users/phoenix/Downloads/MNIST_data",one_hot=True)

#3.每个批次的大小(可改)
batch_size = 100
#4.计算一共有多少个批次
n_batch = mnist.train.num_examples // batch_size

#5.定义两个placeholder
x = tf.placeholder(tf.float32,[None,784])
y = tf.placeholder(tf.float32,[None,10])

#6.创建一个简单的神经网络(可改)
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
prediction = tf.nn.softmax(tf.matmul(x,W)+b)

#7.二次代价函数(可改)
loss = tf.reduce_mean(tf.square(y-prediction))

#8.使用梯度下降法(可改)
train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)

#9.初始化变量(可改)
init = tf.global_variables_initializer()

#10.结果存放在一个布尔型列表中
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))#argmax返回一维张量中最大的值所在的位置
#11.求准确率
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

#12.开始训练,显示训练次数和效果
with tf.Session() as sess:
    sess.run(init)
    for epoch in range(30):
        for batch in range(n_batch):
            batch_xs,batch_ys =  mnist.train.next_batch(batch_size)
            sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys})
        
        test_acc = sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels})
        train_acc = sess.run(accuracy,feed_dict={x:mnist.train.images,y:mnist.train.labels})
        print("Iter " + str(epoch+1) + ",Testing Accuracy " + str(test_acc) +",Training Accuracy " + str(train_acc))

如果正常运行结果如下:
正常结果如下
那么恭喜你完成了。完成之后

提高及优化

a.代码#3处优化

#batch_size = 100
batch_size = 10

优化后效果:准确度提高,速度降低

b.代码#6处优化(增加神经网络和激活函数的选择)

"""
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
prediction = tf.nn.softmax(tf.matmul(x,W)+b)
"""
keep_prob=tf.placeholder(tf.float32)
W1 = tf.Variable(tf.truncated_normal([784,2000],stddev=0.1))
b1 = tf.Variable(tf.zeros([2000])+0.1)
L1 = tf.nn.tanh(tf.matmul(x,W1)+b1)
L1_drop = tf.nn.dropout(L1,keep_prob) 

W4 = tf.Variable(tf.truncated_normal([2000,10],stddev=0.1))
b4 = tf.Variable(tf.zeros([10])+0.1)
prediction = tf.nn.softmax(tf.matmul(L1_drop,W4)+b4)

相对于之前的代码加了一层。
个人的理解原来是784到10,现在是784到2000到10。
不过如果直接这样替换的话应该会报错,需要最后面的稍微改一下,改成下面这三行,加了keep_prob。

            sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys,keep_prob:0.7})
        
        test_acc = sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels,keep_prob:1.0})
        train_acc = sess.run(accuracy,feed_dict={x:mnist.train.images,y:mnist.train.labels,keep_prob:1.0})

c.代码#7处优化(损失函数的优化)

神经网络模型的效果以及优化的目标是通过损失函数( loss function )来定义的

# loss = tf.reduce_mean(tf.square(y-prediction))
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))

d.代码#8处优化(更改优化器)

# train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)
train_step = tf.train.AdamOptimizer(1e-2).minimize(loss)

tensorflow的优化器有很多,如果想深入了解可以看下面这个博客。
优化器的选择
https://blog.csdn.net/junchengberry/article/details/81102058
不知道为什么如果我的这里(#8处)和神经网络那(#6处)同时更改,准确率反而不提升了。

常见问题及解决方法

a.ModuleNotFoundError: No module named ‘tensorflow.examples.tutorials’

这个问题说明你安装的tensorflow没有tutorials文件夹,反应了你安装的tensorflow不完整。所以有的朋友可以通过更改版本解决这个BUG。
这里推荐的方法是先看
\site-packages\tensorflow_core\examples里面有没有tutorials文件夹。如果没有,那么下载下来解压复制进去就行。
链接: tutorials文件夹下载地址
如果不清楚也可以看下面的一些博客当参考
具体步骤可以按照
链接: 解决方法一或者链接: 解决方法二
这个两篇博客来做

b.module ‘tensorflow’ has no attribute ‘placeholder’

这个问题说明你的tensorflow是2.0,而运行1.0的代码,自然会有报错,解决起来也很简单。如下,把import tensorflow as tf换成import tensorflow.compat.v1 as tf。再加一个tf.disable_v2_behavior()

#import tensorflow as tf
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

---------------华丽的分割线-------------

写完了,如果有不懂的地方,欢迎在下面留言。这篇博客最后的常见问题及解决部分也会随着反馈来更新。如果觉得有用,麻烦各位点赞咯。谢谢各位😁。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章