本文简单介绍了用Tensorflow训练MNIST数据集的神经网络的构建过程以及加深神经网络后的调参过程。
MNIST数据集
由于从官网下载速度较慢,百度网盘下载地址:
链接:https://pan.baidu.com/s/1M8Ldp1WspnjJ7s8xvwT41Q 提取码:42bl
一、简单浅层神经网络的构建
1、数据集的读取与使用
数据集的读取用到的是tensorflow提供的读取MNIST数据集的代码,可以点击链接查看代码input_data.py 由于已经下载好了数据集,加载时直接输入路径即可。
import tensorflow as tf
import input_data
minst = input_data.read_data_sets('D:/huohu/mnist_dataset/mnist_dataset',one_hot = True)
上述是我的数据集的下载路径,此处路径需要按照实际情况做出修改。
2、构建计算图
sess = tf.InteractiveSession()
3、创建占位符
x = tf.placeholder("float",shape=[None,784])
y_ = tf.placeholder("float",shape=[None,10])
注意变量的尺寸,784是输入图片的展平的尺寸,因为输出有10类,所以y_输出尺寸为10。
4、变量的创建以及初始化
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
sess.run(tf.global_variables_initializer())
5、模型搭建
y = tf.nn.softmax(tf.matmul(x,W) + b)
简单的回归模型只有一层,利用softmax函数输出类别的概率即可。
6、损失函数
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=y,labels=y_))
损失函数使用softmax交叉熵函数。
7、模型的训练与评估
train_step = tf.train.GradientDescentOptimizer(0.3).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
for i in range(1000):
batch = minst.train.next_batch(50)
train_step.run(feed_dict={x:batch[0],y_:batch[1]})
print(accuracy.eval(feed_dict={x:batch[0],y_:batch[1]}))
使用梯度下降的方法来更新参数,学习率设为0.3,每迭代一次,加载50个样本,用输入图片和标签替代创建好的占位符进行训练,每次迭代打印一次准确率,以便观察模型训练情况。
print(accuracy.eval(feed_dict={x:minst.test.images,y_:minst.test.labels}))
最后打印出模型在测试集上的准确率。此模型在测试集上的准确率约为89.28%。
二、深层神经网络的构建与调参
在上面的简单神经网络的基础上,我们构建一个三层的简单深层神经网络,以提高准确率,同时加深对tensorflow搭建神经网络框架的理解。
三层深层神经网络大致结构如下:
Linear —> Relu —> Linear —> Relu —> Linear —> softmax
以下是基于上述简单神经模型到深层神经网络的修改过程,以及我在修改过程中需要注意的问题。
1、需要修改部分(变量创建和模型搭建)
w1 = tf.Variable(tf.truncated_normal([784,256], stddev=0.1))
b1 = tf.Variable(tf.constant(0.1, shape=[256]))
w2 = tf.Variable(tf.truncated_normal([256,512], stddev=0.1))
b2 = tf.Variable(tf.constant(0.1, shape=[512]))
w3 = tf.Variable(tf.truncated_normal([512,10], stddev=0.1))
b3 = tf.Variable(tf.constant(0.1, shape=[10]))
注意:在深层神经网络中,加入激励函数后,不能再将参数w和b初始化为0,否则神经网络无法学习,导致训练过程中准确率一直很低,在0.1左右,达不到训练效果。
此外,此处的stddev参数也是影响准确率的一个超参数,经测试,设为0.1后,准确率较高。也可以在训练时,调节此参数,找到最佳数值。每层的神经元数量也可以根据实际情况作出修改。
y1 = tf.matmul(x,w1)+ b1
z1 = tf.nn.relu(y1)
y2 = tf.matmul(z1,w2)+ b2
z2 = tf.nn.relu(y2)
y3 = tf.matmul(z2,w3)+ b3
y = tf.nn.softmax(y3)
上述代码实现了三层深度神经网络的构建。
2、影响准确率的超参数
学习率、批次数量、每层神经元数量、初始化参数等。
可以通过修改调整上述参数来提高模型的准确率。在此模型中,我取的学习率为0.3,批次数量为50,每层神经元数量取的256、512,初始化参数stddev=0.1。
最终在训练集上的准确率为92.35%。
3、修改后的完成代码
import tensorflow as tf
import input_data
#加载数据集
minst = input_data.read_data_sets('D:/huohu/mnist_dataset/mnist_dataset',one_hot = True)
#使用tensorflow构建模型的步骤
#1.构建计算图
sess = tf.InteractiveSession()
#2.创建占位符
x = tf.placeholder("float",shape=[None,784])
y_ = tf.placeholder("float",shape=[None,10])
#3.创建变量
w1 = tf.Variable(tf.truncated_normal([784,256], stddev=0.1))
b1 = tf.Variable(tf.constant(0.1, shape=[256]))
w2 = tf.Variable(tf.truncated_normal([256,512], stddev=0.1))
b2 = tf.Variable(tf.constant(0.1, shape=[512]))
w3 = tf.Variable(tf.truncated_normal([512,10], stddev=0.1))
b3 = tf.Variable(tf.constant(0.1, shape=[10]))
#4.初始化变量
sess.run(tf.global_variables_initializer())
#5.类别预测
y1 = tf.matmul(x,w1)+ b1
z1 = tf.nn.relu(y1)
y2 = tf.matmul(z1,w2)+ b2
z2 = tf.nn.relu(y2)
y3 = tf.matmul(z2,w3)+ b3
y = tf.nn.softmax(y3)
#6.损失函数
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=y,labels=y_))
#7.训练模型
train_step = tf.train.GradientDescentOptimizer(0.3).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
for i in range(1000):
batch = minst.train.next_batch(50)
train_step.run(feed_dict={x:batch[0],y_:batch[1]})
print(accuracy.eval(feed_dict={x:batch[0],y_:batch[1]}))
#8.评估模型
print(accuracy.eval(feed_dict={x:minst.test.images,y_:minst.test.labels}))
写在后面
由于第一次写,而且刚入门深度学习,希望大家理解,如有错误,欢迎指出。