本人由于一直从事语义理解引擎开发工作,更多的是接触人机交互系统的优化,模型的落地上线,业务的效果优化等工作,deepLearning接触的不是很多,本篇开始,从零开始学习深度学习知识,深入理解交互系统的整体,从模型到架构。这里主要是用于记录 自己从网上开源的或者其他大神的blog学习。
一.简介
MNIST是开源的一个手写体识别的数据集,该数据集中包含了大量的手写图片,我们这里需要通过对模型的训练,对给出一张图片进行分类,主要包括三个部分:
(1).训练数据集,55000个样本,mnist.train
(2).测试数据集,10000个样本,mnist.test
(3).验证数据集,5000个样本,mnist.validation
从某位大神blog中盗图一张,如下:
每张图片是28*28=784个像素点,白色地方是0,黑色地方都是表示有数字,下面的左边是数字1,右边是图片的像素点
二.具体的分类过程(代码)
# coding:utf-8import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_dataimport pylabmnist = input_data.read_data_sets("MNIST_data",one_hot=True) #one_hot=True 样本标签标记为one-hot 编码print('输入数据:',mnist.train.images)print('输入数据的尺寸:',mnist.train.images.shape)im = mnist.train.images[0] #第一张图片im = im.reshape(-1,28)tf.reset_default_graph() #清除默认图形堆栈并重置全局默认图形#定义占位符x=tf.placeholder(tf.float32,[None,784]) #图像28*28=784y=tf.placeholder(tf.float32,[None,10]) #标签10类#定义学习参数w=tf.Variable(tf.random_normal([784,10])) #权值,初始化为正太随机值b=tf.Variable(tf.zeros([10])) #偏置,初始化为0#定义输出pred=tf.nn.softmax(tf.matmul(x,w)+b)#相当于单层神经网络,激活函数为softmax#损失函数loss=tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred),reduction_indices=1)) #reduction_indices指定计算维度#优化函数optimizer=tf.train.GradientDescentOptimizer(0.01).minimize(loss) ##loss是优化目标函数#定义训练参数training_epochs=200 #训练次数batch_size=100 #每次训练图像数量display_step=10 #打印训练信息周期#保存模型saver=tf.train.Saver()model_path="data/521model.ckpt"#开始训练with tf.Session() as sess :sess.run(tf.global_variables_initializer()) #初始化所有参数for epoch in range(training_epochs) :avg_cost=0.0 #平均损失total_batch=int(mnist.train.num_examples/batch_size) #计算总的训练批次for i in range(total_batch) :batch_xs, batch_ys = mnist.train.next_batch(batch_size) #抽取数据_, c=sess.run([optimizer,loss], feed_dict={x:batch_xs, y:batch_ys}) #运行avg_cost+=c/total_batchif (epoch+1) % display_step == 0 :print("Epoch:",'%04d'%(epoch+1),"cost=","{:.9f}".format(avg_cost))print("Finished!")#测试集测试准确度correct_prediction=tf.equal(tf.argmax(pred,1),tf.argmax(y,1))accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) ###correct_prediction bool值转换成floatprint("Accuracy:",accuracy.eval({x:mnist.test.images,y:mnist.test.labels}))#保存模型save_path=saver.save(sess,model_path)print("Model saved in file: %s" % save_path)
运行的结果如下:
三.具体步骤分析
1.定义占位符
x=tf.placeholder(tf.float32,[None,784]) #图像28*28=784y=tf.placeholder(tf.float32,[None,10]) #标签10类
图片像素是28*28=784,这里主要是把二维的像素矩阵,扁平化的生成为一维,标签的分类为0到9,一共是10,None主要是不确定输入的batch大小
2.定义学习参数
w=tf.Variable(tf.random_normal([784,10])) #权值,初始化为正太随机值b=tf.Variable(tf.zeros([10])) #偏置,初始化为0
tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
(1).shape为输出张量的形状,必须要选择
(2).mean 正态分布的均值,默认是0
(3).stddev 表示正态分布的标准差,默认是1.0
(4).dtype是输出类型
(5).seed是随机数种子,设置之后 每次生成的随机数都一样
(6).name表示的是操作的名称
tf.zeros( shape, dtype=tf.float32, name=None )
(1). shape 表示输出的形状大小,必须
(2).dtype 表示的是类型
(3).name表示的是操作名称
3.定义输出层
pred=tf.nn.softmax(tf.matmul(x,w)+b)
激活函数是softmax,相当于单层的神经网络
4.定义误差loss和训练
交叉熵(Cross Entropy):是loss中的一种,也是损失函数或代价函数,用于描述模型预测值和真实值之间的差距,一般常见的loss为均方平方差(Mean Squared Error),交叉熵描述两个概率分布之间的距离。。当交叉熵越小,越说明二者之间越接近。
本篇计算公式为 tf.reduce_mean(-tf.reduce_sum(ys * tf.log(pred))
#损失函数loss=tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred),reduction_indices=1)) #reduction_indices指定计算维度#优化函数optimizer=tf.train.GradientDescentOptimizer(0.01).minimize(loss) ##loss是优化目标函数
四.使用LSTM进行模型分类
# coding:utf-8import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_datafrom tensorflow.contrib import rnnmnist=input_data.read_data_sets("MNIST_data/",one_hot=True)#parameters set lr = 0.01train_iter = 100000batch_size = 100n_inputs = 28n_steps = 28n_hidden_unites = 128n_classes = 10n_batch = mnist.train.num_examples//batch_sizex_ = tf.placeholder(tf.float32,[None,784])y_ = tf.placeholder(tf.float32,[None,10])weights = tf.Variable(tf.truncated_normal([n_hidden_unites,n_classes],stddev=0.1)) ### 128*10bias = tf.Variable(tf.constant(0.1,shape=[n_classes])) ##常量设置 [0.1,0.1,0.1,....0.1]### y = wx + bdef RnnModel(x,w,b):input = tf.reshape(x,[-1,n_steps,n_inputs]) ##shape 28*28lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(n_hidden_unites)outputs,finally_class = tf.nn.dynamic_rnn(lstm_cell,input,dtype=tf.float32)y = finally_class[1] ## the step is import results = tf.nn.softmax(tf.matmul(y,w) + b)return resultsif __name__ == '__main__':predict = RnnModel(x_,weights,bias)loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = predict, labels = y_))train_step = tf.train.AdamOptimizer(1e-3).minimize(loss)correct_prediction = tf.equal(tf.argmax(y_, 1), tf.argmax(predict, 1)) ###tf.argmax(y,1) 每一行的最大值元素输出数组[]accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) ##计算正确率 tf.cast是类型转换init = tf.global_variables_initializer()with tf.Session() as sess:sess.run(init)for epoch in range(20):for iter 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})acc = sess.run(accuracy,feed_dict={x_:mnist.test.images,y_:mnist.test.labels})print("Iter " + str(epoch) + ", Testing Accuracy=" + str(acc))
如果觉得《tensorflow实战之手写体识别》对你有帮助,请点赞、收藏,并留下你的观点哦!