TensorFlow入门_2_mnist数据集训练与相关函数解释

1.全部代码

from tensorflow.examples.tutorials.mnist import input_data
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
mnist = input_data.read_data_sets('E:\img\mnist', one_hot=True)
n_batch = mnist.train.num_examples
print(n_batch)


with tf.name_scope("input"):
    x = tf.placeholder(tf.float32,[None,784],name = 'x-input')
    y = tf.placeholder(tf.float32,[None,10],name = "y-input")

W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))

prediction = tf.nn.softmax(tf.matmul(x,W)+b)

loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels = y,logits = prediction))
train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)


c_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))
accuracy = tf.reduce_mean(tf.cast(c_prediction,tf.float32))

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    for epoch in range(300):
        batch_x,batch_y = mnist.train.next_batch(100)
        sess.run(train_step,feed_dict={x:batch_x,y:batch_y})
        acc = sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels})
        print("Iter {}, Testing Acc : {}".format(epoch,acc))

2.准备数据

from tensorflow.examples.tutorials.mnist import input_data
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
mnist = input_data.read_data_sets('E:\img\mnist', one_hot=True)
print(n_batch)
'''输出:
Extracting E:\img\mnist\train-images-idx3-ubyte.gz
Extracting E:\img\mnist\train-labels-idx1-ubyte.gz
Extracting E:\img\mnist\t10k-images-idx3-ubyte.gz
Extracting E:\img\mnist\t10k-labels-idx1-ubyte.gz
55000
'''

3.定义变量

输入变量(图片和标签)

x = tf.placeholder(tf.float32,[None,784])#input
y = tf.placeholder(tf.float32,[None,10])#output

placeholder翻译过来是占位符的意思,mnist数据集单张图片是一维通道的灰度图,28*28*1=784,数字0-9共10个,上面两行代码的意思就是声明输入变量,其中x是长度为784的一维变量,y是长度为10的一维变量,代表图片代表的数字是几(0-9)

placeholder 参数详解


变量

W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))

定义两个变量,初始值是通过tf.zeros()生成,这里Wb分别是784*10和1*10的向量


预测值和loss

predictionon = tf.nn.softmax(tf.matmul(x,W)+b)
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels = y,logits = prediction))

tf.nn.softmax是分类器,公式是
这里写图片描述
即将一堆向量得到一个总和为1的向量,在mnist训练中,将返回一个1*10的向量(和为1)

tf.nn.softmax_cross_entropy_with_logits_v2是求交叉熵,也就是求信息的不确定性,返回的是一个值均为负的向量,而loss是一个单独的值,所以还需要将这个向量按一定权重集合,就需要嵌套一个函数

tf.reduce_mean是求出所给参数的平均值,与之类似的还有tf.reduce_maxtf.reduce_sum…等


预测结果与准确率

c_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))
accuracy = tf.reduce_mean(tf.cast(c_prediction,tf.float32))

tf.equal判断是否相等,上文代码是将y(真实结果)与prediction(预测结果)是否相等,返回一系列bool[False,True,False...]

tf.cast是将参数1的值转为参数2的类型(只要能转换),上文代码是将返回的bool值变为float类型(1与0),再通过 tf.reduce_mean() 求平均值,得到的结果显而易见,即为准确率


4.初始化与训练

init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    for epoch in range(300):
        batch_x,batch_y = mnist.train.next_batch(100)
        sess.run(train_step,feed_dict={x:batch_x,y:batch_y})
        acc = sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels})
        print("Iter {}, Testing Acc : {}".format(epoch,acc))

以上只是定义了一部分变量,但是要使用,需要一个初始化的过程,也就是之前做的只是生成了一堆静态的元素(或流程),而要让它动起来,需要初始化,tf.global_variables_initializer()就是生成一个初始化所有变量的初始化器,(这个初始化器同样也是静态的,需要run()调用才能完成初始化过程)

tf.Session()表示开启一段会话,在会话开启的过程中可以让整个图动起来,也就是让 会话run起来。
在一开始,sess.run(init)调用了初始化方法,初始化了所有的变量后,就可以run其他的变量了,在run的过程中,所有与run的元素相关的元素都会跑起来

#train_step涉及的loss,x,y,W,b...都会一起参与运算
sess.run(train_step,feed_dict={x:batch_x,y:batch_y})
#accuracy涉及的c_prediction,y,prediction会参与运算
acc = sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels})

通过案例来分析一个模块的用法是我比较喜欢的方式,但有时候可能会局限于某个点而不够全面,这个时候可能就需要在了解到一定程度后去深入的学习了

猜你喜欢

转载自blog.csdn.net/sailist/article/details/79815724