Tensorflow训练MNIST数据集(由浅层到深层神经网络的构建和调参)

本文简单介绍了用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}))

写在后面

由于第一次写,而且刚入门深度学习,希望大家理解,如有错误,欢迎指出。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值