TF0006、优化器AdamOptimizer和GradientDescentOptimizer

本文通过构建一个简单的神经网络,使用MNIST数据集,对比了GradientDescentOptimizer和AdamOptimizer两种优化器的性能。实验结果显示,AdamOptimizer在相同的训练次数下,能够达到更高的准确度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文以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。哈哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值