MNIST全连接网络识别代码(二)

两层的全连接神经网络实现手写数字识别

1. 导入包并创建默认的InteractiveSession

下面这段代码在上一篇中有详细注释https://mp.csdn.net/mdeditor/85038605#

from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
sess = tf.InteractiveSession()

2. 构建模型

2.1 网络结构

网络包括输入层,隐藏层和输出层三层,隐藏层用了Dropout方法防止过拟合

in_units = 784//输入层节点
hl_units = 300//隐藏层节点

W1 = tf.Variable(tf.truncated_normal([in_units, h1_units], stddev=0.1))//设置输入层到隐藏层的权重,
//truncated_normal(shape,mean,stddev)
//截断正态分布。用于产生正态分布,mean均值和stddev标准差由自己设置。此函数产生的随机数与均值的差距不会超过
//两倍的标准差,由于下面使用的ReLUctant函数,用正太分布给参数加一些噪声,来打破完全对称并且避免0梯度。
b1 = tf.Variable(tf.zeros([h1_units]))//设置输入层到隐藏层的偏置

W2 = tf.Variable(tf.zeros([h1_units, 10]))//设置隐藏层到输出层的权重,上一层是h1_units个节点,下一层是10个节点
b2 = tf.Variable(tf.zeros([10]))//设置隐藏层到输出层的偏置

x = tf.placeholder(tf.float32, [None, in_units])//设置存放输入变量的placeholder
keep_prob = tf.placeholder(tf.float32)//Dropout方法中用来设置保留节点的概率值

hidden1 = tf.nn.relu(tf.matmul(x, W1)+b1)//输入层到隐藏层的激活函数用ReLU函数
hidden1_drop = tf.nn.dropout(hidden1, keep_prob)//Dropout方法用于防止过拟合。隐藏层某些神经元按照Dropout的概率随机置为0,keep_prob的值为不置为0的比例,应小于1。

y = tf.nn.softmax(tf.matmul(hidden1_drop, W2)+b2)//y为网络结构得出的输出,采用softmax多分类器对数字进行分类
y_ = tf.placeholder(tf.float32, [None, 10])//y_为实际的标签

2.2 学习方式和评价指标(损失函数、优化器和准确率)

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
train_step = tf.train.AdagradOptimizer(0.3).minimize(cross_entropy)//用Adagrad来优化,学习率定在0.3比较好。也可以用SGD、Adadelta、RMSprop、Adam等优化器。SGD、Adadelta优化器一般比较好的学习率是0.6,RMSprop、Adam优化器一般比较好的学习率是1e-4。
train_step = tf.train.AdagradOptimizer(0.3).minimize(cross_entropy)//训练方式,以0.3的学习率在优化器中学习,找到最小的损失。
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))//真实值和预测值之间的比较,结果是一个一维的布尔矩阵
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))//准确率

3. 训练

tf.global_variables_initializer().run()//训练前的准备,初始化所有的参数
// 训练
for i in range(3000):// 训练3000// 获取100条数据作为一个batch
    batch_xs, batch_ys = mnist.train.next_batch(100)//这里有个疑问,就是train.next_batch是随机获取指定数量的数据还是按顺序的去获取制定数量的数据,已经训练过的数据会不会重复训练,望看到的大神给解答下,谢谢了。
    // 训练,这里的Dropout的设置为0.75  
    train_step.run({x: batch_xs, y_: batch_ys, keep_prob: 0.75})
    //100个batch的训练做一个预测
    if i % 100 == 0:
        # 输出准确率,这里的Dropout的设置为1
        print("Step %d" % (i))
        print("Train accuracy:", accuracy.eval({x: batch_xs, y_: batch_ys, keep_prob: 0.75}))//训练的准确率
        print("Test accuracy:", accuracy.eval({x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))//预测的准确率

PS: 初学图像处理,还是小白,大家有问题多多交流。文中代码借鉴部分参考资料,有问题还请指正,十分感谢!本周感想:作为计算机的程序媛,其实很讨厌代码,但是对于python这个语言感觉还是很神奇的,加之毕业需要,迫使自己研究深度学习,不得不学这个代码,愿每一个在计算机坑里面的人,都能努力爬出坑。O(∩_∩)O哈哈~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章