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)
变量
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
定义两个变量,初始值是通过tf.zeros()
生成,这里W
和b
分别是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_max
,tf.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})
通过案例来分析一个模块的用法是我比较喜欢的方式,但有时候可能会局限于某个点而不够全面,这个时候可能就需要在了解到一定程度后去深入的学习了