TF0006、优化器AdamOptimizer和GradientDescentOptimizer

本文以MNIST数据集为例,构造输入层为784,输出层为10的简单神经网络,分别使用常用优化器AdamOptimizer和GradientDescentOptimizer,进行对比。

请先将MNIST数据集下载到本地,下载地址链接:https://pan.baidu.com/s/1ZlfUjopsi-ffpxMSPuZi5A 提取码:yte2

1、加载数据集

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import warnings
warnings.filterwarnings('ignore')
mnist = input_data.read_data_sets(train_dir=r'C:\Users\zx\Desktop\MLCodes\MyAIRoad\MNIST_data',one_hot=True)

#设置批次大小
batch_size = 64
#计算有多少批
n_batch = mnist.train.num_examples // batch_size

2、 使用 GradientDescentOptimizer

#定义用于输入的placeholder
x = tf.placeholder(tf.float32,[None,784])
#定义用于输出的placeholder
y = tf.placeholder(tf.float32,[None,10])

#构建一个输入层为784,输出层为10 的神经网络
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
x_w_b = tf.matmul(x,W) + b
#使用softmax激活函数
prediction = tf.nn.softmax(x_w_b)

#使用二次代价函数
loss = tf.losses.mean_squared_error(y,prediction)

#设置学习率
lr = 0.3
#使用GradientDescentOptimizer优化器
optimizer = tf.train.GradientDescentOptimizer(lr)
#最小化损失函数
train = optimizer.minimize(loss)

#变量初始化
init = tf.global_variables_initializer()

#结果存放在一个布尔型列表中
#argmax返回一维张量中最大的值所在的位置
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))

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

#创建session训练网络
with tf.Session() as session:
    #数据初始化
    session.run(init)
    #训练20遍
    for epoch in range(1,21):
        for batch in range(n_batch):
            x_batch,y_batch = mnist.train.next_batch(batch_size)
            session.run(train,feed_dict={x:x_batch,y:y_batch})

        #用测试数据计算准确度
        accu = session.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels})
        print("第%i次训练后,准确度accuracy为:%.6f"%(epoch,accu))

输出:

第1次训练后,准确度accuracy为:0.876600
第2次训练后,准确度accuracy为:0.892600
第3次训练后,准确度accuracy为:0.899600
第4次训练后,准确度accuracy为:0.904300
第5次训练后,准确度accuracy为:0.906400
第6次训练后,准确度accuracy为:0.909000
第7次训练后,准确度accuracy为:0.910900
第8次训练后,准确度accuracy为:0.912400
第9次训练后,准确度accuracy为:0.913800
第10次训练后,准确度accuracy为:0.915200
第11次训练后,准确度accuracy为:0.915900
第12次训练后,准确度accuracy为:0.917200
第13次训练后,准确度accuracy为:0.917800
第14次训练后,准确度accuracy为:0.917500
第15次训练后,准确度accuracy为:0.918800
第16次训练后,准确度accuracy为:0.919200
第17次训练后,准确度accuracy为:0.919300
第18次训练后,准确度accuracy为:0.919800
第19次训练后,准确度accuracy为:0.920100
第20次训练后,准确度accuracy为:0.920800

3、使用AdamOptimizer

#定义用于输入的placeholder
x = tf.placeholder(tf.float32,[None,784])
#定义用于输出的placeholder
y = tf.placeholder(tf.float32,[None,10])

#构建一个输入层为784,输出层为10 的神经网络
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
x_w_b = tf.matmul(x,W) + b
#使用softmax激活函数
prediction = tf.nn.softmax(x_w_b)

#使用二次代价函数
loss = tf.losses.mean_squared_error(y,prediction)

#设置学习率,使用AdamOptimizer学习率要小些
lr = 0.001
#使用AdamOptimizer优化器
optimizer = tf.train.AdamOptimizer(lr)
#最小化损失函数
train = optimizer.minimize(loss)

#变量初始化
init = tf.global_variables_initializer()

#结果存放在一个布尔型列表中
#argmax返回一维张量中最大的值所在的位置
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))

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

#创建session训练网络
with tf.Session() as session:
    #数据初始化
    session.run(init)
    #训练20遍
    for epoch in range(1,21):
        for batch in range(n_batch):
            x_batch,y_batch = mnist.train.next_batch(batch_size)
            session.run(train,feed_dict={x:x_batch,y:y_batch})

        #用测试数据计算准确度
        accu = session.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels})
        print("第%i次训练后,准确度accuracy为:%.6f"%(epoch,accu))

输出:

第1次训练后,准确度accuracy为:0.914200
第2次训练后,准确度accuracy为:0.922800
第3次训练后,准确度accuracy为:0.925800
第4次训练后,准确度accuracy为:0.927400
第5次训练后,准确度accuracy为:0.928700
第6次训练后,准确度accuracy为:0.930200
第7次训练后,准确度accuracy为:0.930500
第8次训练后,准确度accuracy为:0.931000
第9次训练后,准确度accuracy为:0.931200
第10次训练后,准确度accuracy为:0.932500
第11次训练后,准确度accuracy为:0.931900
第12次训练后,准确度accuracy为:0.932900
第13次训练后,准确度accuracy为:0.933300
第14次训练后,准确度accuracy为:0.931100
第15次训练后,准确度accuracy为:0.933100
第16次训练后,准确度accuracy为:0.933000
第17次训练后,准确度accuracy为:0.934200
第18次训练后,准确度accuracy为:0.933500
第19次训练后,准确度accuracy为:0.933300
第20次训练后,准确度accuracy为:0.930300

4、结论

当不知道该使用哪个优化器的时候,优先选择 AdamOptimizer。哈哈

发布了23 篇原创文章 · 获赞 1 · 访问量 3353

猜你喜欢

转载自blog.csdn.net/ABCDABCD321123/article/details/104318239
今日推荐