【TensorFlow】学习率、迭代次数和初始化方式对准确率的影响

想必学过机器学习的人都知道,学习率、训练迭代次数和模型参数的初始化方式都对模型最后的准确率有一定的影响,那么影响到底有多大呢?

我初步做了个实验,在 TensorFlow 框架下使用 Logistics Regression 对经典的 MNIST 数据集进行分类。

本文所说的 准确率 均指 测试准确率

代码

from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets("/home/alan/data/", one_hot=True)

from __future__ import print_function
import tensorflow as tf
import matplotlib.pyplot as plt
# 如果运行提示没有seaborn库,可以注释掉这行代码
# 也可以使用 pip install seaborn或者 conda install seaborn安装
import seaborn
# 我是在Jupyter Notebook下运行的
# 如果你是在命令行运行那么就注释掉下面这一行
%matplotlib inline

# 设置模型
# 学习率
learning_rate = 0.01
# 训练迭代次数
training_epochs = 50
# batch大小
batch_size = 100
# 每多少次迭代显示一次损失
display_step = 1

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

# 模型参数
# W = tf.Variable(tf.zeros([784, 10]))
# b = tf.Variable(tf.zeros([10]))
W = tf.Variable(tf.truncated_normal([784, 10]))
b = tf.Variable(tf.truncated_normal([10]))

# 建立模型
pred = tf.nn.softmax(tf.matmul(x, W) + b)

# 定义损失函数:交叉熵
cost = tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred), reduction_indices=1))

# 梯度下降
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

# 初始化所有变量
init = tf.initialize_all_variables()

# 训练模型
with tf.Session() as sess:
    sess.run(init)

    ax1 = plt.subplot(211)
    ax1.set_ylabel("Accuracy")
    ax2 = plt.subplot(212, sharex=ax1)
    ax2.set_ylabel("Cost")
    ax2.set_xlabel("Epoch")
    plt.setp(ax1.get_xticklabels(), visible=False)

    for epoch in range(training_epochs):
        avg_cost = 0
        total_batch = int(mnist.train.num_examples / batch_size)

        for i in range(total_batch):
            batch_xs, batch_ys = mnist.train.next_batch(batch_size)
            _, c = sess.run([optimizer, cost], feed_dict={x: batch_xs, y: batch_ys})

            avg_cost += c / total_batch

        if (epoch + 1) % display_step == 0:
             # 计算测试准确率
            correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
            accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

            ax1.plot(epoch+1, accuracy.eval({x: mnist.test.images, y: mnist.test.labels}), 'mo')
            ax2.plot(epoch+1, avg_cost, 'co') 

            print("Epoch:", '%04d' % (epoch+1), "cost=", '{:.9f}'.format(avg_cost), end=' ')
            print("Accuracy:", accuracy.eval({x: mnist.test.images, y: mnist.test.labels}))

    print("Optimization Finished!")

    print("Accuracy:", accuracy.eval({x: mnist.test.images, y: mnist.test.labels}))
    plt.suptitle("learning rate=%f, training epochs=%i, with tf.truncated_normal()" % (learning_rate, training_epochs), size=14)
    plt.savefig('AC8.png', dpi=300)
    plt.show()

通过修改 learning_ratetraining_epochs来修改学习率和迭代次数,修改

# 所有变量初始化为0
# W = tf.Variable(tf.zeros([784, 10]))
# b = tf.Variable(tf.zeros([10]))

# 所有变量初始化为符合标准截断正态分布的随机数
W = tf.Variable(tf.truncated_normal([784, 10]))
b = tf.Variable(tf.truncated_normal([10]))

来修改变量的初始化方式。程序最终会输出损失和准确率随着迭代次数的变化趋势图。

结果

以下结果的背景是:TensorFlow,Logistics Regression,MNIST数据集,很可能换一个数据集下面的结论中的某一条就不成立啦,所以要具体情况具体分析,找到最优的超参数组合。

多次的更改会输出多个不同的图,我们先来看下最终的准确率比较,然后再看下每种情况的详细的损失和准确率变化。

符号说明

  • lr:Learning Rate,学习率
  • te:Training Epochs,训练迭代次数
  • ztf.zeros(),变量初始化为0
  • ttf.truncated_normal(),变量初始化为标准截断正态分布的随机数

最终准确率比较

可以看到

  • 学习率为0.1,迭代次数为50次,并且采用随机初始化方式时准确率远远低于其他方式,甚至不足90%。而学习率为0.1,迭代次数为50次,并且采用随机初始化的方式时准确率最高。
  • 对于采用随机初始化的方式,在其他参数相同的情况下增大迭代次数会明显的提高准确率。而对于初始化为0的情况则无明显变化。
  • 其他参数相同的情况下,过度增大学习率的确是会导致准确率下降的,查看详细变化过程时可以看到准确率变化波动比较大。
  • 在学习率适中,迭代次数较大时变量初始化方式对最终准确率的影响不大。

每种情况损失和准确率的详细变化趋势

与上图的顺序保持一致,从上至下。 每张图的标题在图的下面,斜体字。

学习率为1,迭代次数为50,随机初始化

学习率为1,迭代次数为50,初始化为0

学习率为0.1,迭代次数为50,随机初始化

学习率为0.1,迭代次数为50,初始化为0

学习率为0.1,迭代次数为25,随机初始化

学习率为0.1,迭代次数为25,初始化为0

学习率为0.01,迭代次数为50,随机初始化

学习率为0.01,迭代次数为50,初始化为0

大部分情况下准确率和损失的变化时单调的,但是当学习率过大(=1)时准确率开始不稳定。

END

暂且就是这么多,我说的难免有不合适的地方,有错误的地方欢迎指出。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT派

用 Keras 编写你的第一个人工神经网络

创建一个新的文件,命名为 keras_first_network.py ,然后将教程的代码一步步复制进去。

895
来自专栏ATYUN订阅号

什么?!只用30行代码就能创建一个JavaScript的神经网络?

在本文中,我将向你展示如何使用Synaptic.js来创建和训练神经网络,它允许你在Node.js和浏览器中进行深度学习。我们将创建最简单的神经网络:一个能够解...

3568
来自专栏人工智能LeadAI

Tensorflow之 CNN卷积神经网络的MNIST手写数字识别

前言 tensorflow中文社区对官方文档进行了完整翻译。鉴于官方更新不少内容,而现有的翻译基本上都已过时。故本人对更新后文档进行翻译工作,纰漏之处请大家指正...

5235
来自专栏人工智能LeadAI

多层感知机(MLP)与神经网络结构 | 深度学习笔记

为了尽量能形成系统的体系,作为最基本的入门的知识,请参考一下之前的一篇:感知机 | 神经网络 。 上篇文章让你形成对于神经网络最感性的理解。有些看不懂的直接忽...

4149
来自专栏人工智能

具有张量流的混合密度网络

不久之前,Google开源了TensorFlow,这是一个旨在简化图表计算的库。 主要的应用程序是针对深度学习,将神经网络以图形形式显示。 我花了几天的时间阅读...

3806
来自专栏数据派THU

独家 | 一文读懂TensorFlow基础

本文长度为7196字,建议阅读10分钟 本文为你讲解如何使用Tensorflow进行机器学习和深度学习。 1. 前言 深度学习算法的成功使人工智能的研究和应用取...

2157
来自专栏ATYUN订阅号

【学术】机器学习优化函数的直观介绍

AiTechYun 编辑:yuxiangyu 优化是机器学习的研究人员最感兴趣的领域之一。在本文中,我想从简单的函数优化开始介绍,然后讨论找到只能找到局部最小值...

3326
来自专栏https://www.cnblogs.com/L

【TensorFlow篇】--Tensorflow框架实现SoftMax模型识别手写数字集

本文讲述用Tensorflow框架实现SoftMax模型识别手写数字集,来实现多分类。

751
来自专栏华章科技

三天速成!香港科技大学TensorFlow课件分享

该教程第一天先介绍了深度学习和机器学习的潜力与基本概念,而后便开始探讨深度学习框架 TensorFlow。首先我们将学到如何安装 TensorFlow,其实我们...

602
来自专栏IT派

一文带你入门Tensorflow

导语:此文编译自FCC(FreeCodeCamp),作者为Déborah Mesquita,该作者利用神经网络和TensorFlow进行了机器文本分类,并提出了...

4119

扫码关注云+社区