文章目录

  1. 1. 第一次改造
  2. 2. 第二次改造

阅读完《TensorFlow 学习摘要(三) 深度学习 - 手写数字识别入门 - MNIST机器学习》与《TensorFlow 学习摘要(三) 深度学习 - 欠拟合和过拟合》两篇文章后,我们现在可以对之前《TensorFlow 学习摘要(三) 深度学习 - 手写数字识别入门 - MNIST机器学习》中的案例进行改造,让它显示训练集和验证集的准确率结果。

第一次改造

这里,我们需要打印出训练集和验证集的准确率结果。因此,需要添加如下代码。

test_acc = sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})
train_acc = sess.run(accuracy, feed_dict={x: mnist.train.images, y_: mnist.train.labels})
# 在session中启动accuracy,输入是MNIST中的测试集
print("测试集准确率:" + str(test_acc) + "; 训练集准确率:" + str(train_acc))

完整代码,如下所示。

import tensorflow as tf

# 导入 input_data 用于自动下载和安装MNIST数据集
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

# 放置占位符,用于在计算时接收输入值
x = tf.placeholder("float", [None, 784])
# 为了进行训练,需要把正确值一并传入网络
y_ = tf.placeholder("float", [None,10])

# 创建两个变量,分别用来存放权重值W和偏置值b
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))

# 使用softmax回归模型,y代表输出
y = tf.nn.softmax(tf.matmul(x, W) + b)

# 计算交叉墒
loss = tf.nn.softmax_cross_entropy_with_logits(labels=y_,logits=y)

# 使用梯度下降算法以0.01的学习率最小化交叉墒
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss)

# 初始化之前创建的变量的操作
init = tf.initialize_all_variables()

#启动初始化
with tf.Session() as sess:
    sess.run(init)

    for epoch in range(10):
        for i in range(1000):
            batch_xs, batch_ys = mnist.train.next_batch(100)
            sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

        # 评估模型
        correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))

        # 计算正确预测项的比例
        accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

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

        # 在session中启动accuracy,输入是MNIST中的测试集
        print("测试集准确率:" + str(test_acc) + "; 训练集准确率:" + str(train_acc))

打印,结果如下所示。

测试集准确率:0.9136; 训练集准确率:0.9088
测试集准确率:0.9206; 训练集准确率:0.916564
测试集准确率:0.9223; 训练集准确率:0.921382
测试集准确率:0.9238; 训练集准确率:0.923745
测试集准确率:0.9237; 训练集准确率:0.925327
测试集准确率:0.9254; 训练集准确率:0.926673
测试集准确率:0.9261; 训练集准确率:0.928818
测试集准确率:0.9261; 训练集准确率:0.928982
测试集准确率:0.9281; 训练集准确率:0.931255
测试集准确率:0.9284; 训练集准确率:0.931491

至此,我们可以看出,测试集准确率是 92.84%,说明它的错误率是 7.16%,偏差还是有些大。

第二次改造

现在,我们引入几个隐藏层,再来观察下结果。

添加代码,如下所示。

# 创建深度神经网络
W1 = tf.Variable(tf.truncated_normal([784, 2000], stddev=0.1))
b1 = tf.Variable(tf.zeros([2000]) +0.1)
L1 = tf.nn.tanh(tf.matmul(x, W1) + b1)

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

W3 = tf.Variable(tf.truncated_normal([2000, 1000], stddev=0.1))
b3 = tf.Variable(tf.zeros([1000]) +0.1)
L3 = tf.nn.tanh(tf.matmul(L2, W3) + b3)

W4 = tf.Variable(tf.truncated_normal([1000, 10], stddev=0.1))
b4 = tf.Variable(tf.zeros([10]) +0.1)

完整代码,如下所示。

import tensorflow as tf

# 导入 input_data 用于自动下载和安装MNIST数据集
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

# 放置占位符,用于在计算时接收输入值
x = tf.placeholder(tf.float32, [None, 784])
# 为了进行训练,需要把正确值一并传入网络
y_ = tf.placeholder(tf.float32, [None,10])

# 创建深度神经网络
W1 = tf.Variable(tf.truncated_normal([784, 2000], stddev=0.1))
b1 = tf.Variable(tf.zeros([2000]) +0.1)
L1 = tf.nn.tanh(tf.matmul(x, W1) + b1)

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

W3 = tf.Variable(tf.truncated_normal([2000, 1000], stddev=0.1))
b3 = tf.Variable(tf.zeros([1000]) +0.1)
L3 = tf.nn.tanh(tf.matmul(L2, W3) + b3)

W4 = tf.Variable(tf.truncated_normal([1000, 10], stddev=0.1))
b4 = tf.Variable(tf.zeros([10]) +0.1)

# 使用softmax回归模型,y代表输出
y = tf.nn.softmax(tf.matmul(L3, W4) + b4)

# 计算交叉墒
loss = tf.nn.softmax_cross_entropy_with_logits(labels=y_,logits=y)

# 使用梯度下降算法以0.01的学习率最小化交叉墒
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss)

# 初始化之前创建的变量的操作
init = tf.initialize_all_variables()

#启动初始化
with tf.Session() as sess:
    sess.run(init)

    for epoch in range(10):
        for i in range(1000):
            batch_xs, batch_ys = mnist.train.next_batch(100)
            sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

        # 评估模型
        correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))

        # 计算正确预测项的比例
        accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

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

        # 在session中启动accuracy,输入是MNIST中的测试集
        print("测试集准确率:" + str(test_acc) + "; 训练集准确率:" + str(train_acc))

打印,结果如下所示。

测试集准确率:0.8444; 训练集准确率:0.853909
测试集准确率:0.8668; 训练集准确率:0.878
测试集准确率:0.97; 训练集准确率:0.980127
测试集准确率:0.9751; 训练集准确率:0.987073
测试集准确率:0.9743; 训练集准确率:0.989673
测试集准确率:0.9731; 训练集准确率:0.991473
测试集准确率:0.9763; 训练集准确率:0.993145
测试集准确率:0.9784; 训练集准确率:0.994727
测试集准确率:0.9795; 训练集准确率:0.995527
测试集准确率:0.9797; 训练集准确率:0.995727

至此,我们可以看出,测试集准确率是 97.97%,训练集准确率 99.57%,方差有些高,存在过拟合的情况。

因此,在下篇文章中,我们来了解通过正则化方法来解决过拟合的问题。

(完)

微信公众号

文章目录

  1. 1. 第一次改造
  2. 2. 第二次改造