Tensorflow学习笔记:基础篇(4)——Mnist手写集改进版(添加隐藏层)

Tensorflow学习笔记:基础篇(4)——Mnist手写集改进版(添加隐藏层)


前序

— 前文中,我们的初始版本实现了一个非常简单的两层全连接网络来完成MNIST数据的分类问题,输入层784个神经元,输出层10个神经元,最终迭代计算20次,准确率在0.91左右,本文我们采取添加隐藏层的方法进行训练,看看效果如何
Reference:前文博客:Mnist手写集初始版本


计算流程

1、数据准备

2、准备好placeholder

3、初始化参数/权重

4、计算预测结果

5、计算损失值

6、初始化optimizer

7、指定迭代次数,并在session执行graph


代码示例

1、数据准备

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

# 载入数据集
mnist = input_data.read_data_sets("MNIST_data", one_hot=True)

# 每个批次送100张图片
batch_size = 100
# 计算一共有多少个批次
n_batch = mnist.train.num_examples // batch_size

2、准备好placeholder

x = tf.placeholder(tf.float32, [None, 784])
y = tf.placeholder(tf.float32, [None, 10])

3、初始化参数/权重

此处我们添加了两个隐藏层,分别有500和300个神经元,这样包括输入输出层,总共4层神经网络
其中:
(1)隐藏层初始化函数建议使用tf.truncated_normal()(截短的随机数)类型,而非前文中的tf.zero()(初始化为零)类型
(2)中间层的激活函数,本文使用tanh(双曲正切函数),建议读者可以尝试运用ReLU函数或者Sigmoid函数,比较一下输出结果

W1 = tf.Variable(tf.truncated_normal([784, 500], stddev=0.1), name='W1')
b1 = tf.Variable(tf.zeros([500]) + 0.1, name='b1')
L1 = tf.nn.tanh(tf.matmul(x, W1) + b1, name='L1')

W2 = tf.Variable(tf.truncated_normal([500, 300], stddev=0.1), name='W2')
b2 = tf.Variable(tf.zeros([300]) + 0.1, name='b2')
L2 = tf.nn.tanh(tf.matmul(L1, W2) + b2, name='L2')

W3 = tf.Variable(tf.truncated_normal([300, 10], stddev=0.1), name='W3')
b3 = tf.Variable(tf.zeros([10]) + 0.1, name='b3')

4、计算预测结果

最后一层的激活函数依然是softmax函数

prediction = tf.nn.softmax(tf.matmul(L2, W3) + b3)

5、计算损失值

这里我们依旧使用二次代价函数

loss = tf.reduce_mean(tf.square(y - prediction))

6、初始化optimizer

learning_rate = 0.2
optimizer =  tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)

# 结果存放在一个布尔型列表中
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(prediction, 1))  

# 求准确率
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

7、指定迭代次数,并在session执行graph

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    for epoch in range(21):
        for batch in range(n_batch):
            batch_xs, batch_ys = mnist.train.next_batch(batch_size)
            sess.run(optimizer, feed_dict={x: batch_xs, y: batch_ys})

        test_acc = sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels})

        if epoch % 2 == 0:
            print("Iter" + str(epoch) + ", Testing accuracy:" + str(test_acc))

运行结果

迭代计算20次,准确率0.95左右,准确率较上次的0.91有了一定的提升,请读者思考并尝试,如何继续修改以继续提高准确率呢~~
Tensorflow学习笔记:基础篇(4)——Mnist手写集改进版(添加隐藏层)_第1张图片


完整代码

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets("MNIST_data", one_hot=True)

# 每个批次的大小
batch_size = 100
# 计算一共有多少个批次
n_batch = mnist.train.num_examples // batch_size

x = tf.placeholder(tf.float32, [None, 784], name='x_input')
y = tf.placeholder(tf.float32, [None, 10], name='y_input')


W1 = tf.Variable(tf.truncated_normal([784, 500], stddev=0.1), name='W1')
b1 = tf.Variable(tf.zeros([500]) + 0.1, name='b1')
L1 = tf.nn.tanh(tf.matmul(x, W1) + b1, name='L1')

W2 = tf.Variable(tf.truncated_normal([500, 300], stddev=0.1), name='W2')
b2 = tf.Variable(tf.zeros([300]) + 0.1, name='b2')
L2 = tf.nn.tanh(tf.matmul(L1, W2) + b2, name='L2')

W3 = tf.Variable(tf.truncated_normal([300, 10], stddev=0.1), name='W3')
b3 = tf.Variable(tf.zeros([10]) + 0.1, name='b3')

prediction = tf.nn.softmax(tf.matmul(L2, W3) + b3)

# 二次代价函数
loss = tf.reduce_mean(tf.square(y - prediction))


# 梯度下降
optimizer = tf.train.GradientDescentOptimizer(0.2).minimize(loss)


correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(prediction, 1))

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)

    for epoch in range(21):

        for batch in range(n_batch):
            batch_xs, batch_ys = mnist.train.next_batch(batch_size)
            sess.run(optimizer, feed_dict={x: batch_xs, y: batch_ys})

        test_acc = sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels})

        if epoch % 2 == 0:
            print("Iter" + str(epoch) + ", Testing accuracy:" + str(test_acc))

你可能感兴趣的:(Tensorflow学习笔记)