Tensorflow——优化器的使用

对于Tensorflow中的优化器(Optimizer),目前已有的有以下:

  • tf.train.GradientDescentOptimizer()       常用的梯度下降法
  • tf.train.Adadeltatimizer()
  • tf.train.Adagradoptimizer()
  • tf.train.AdagradDAOptimizer()
  • tf.train.MomentumOptimizer()
  • tf.train.AdamOptimizer()
  • tf.train.Ftrloptimizer()
  • tf.train.ProximalGradientDescentOptimizer()
  • tf.train.ProximalAdgradOptimizer()
  • tf.train.Rmspropoptimizer()

不同的优化器有各自的特点,不能说谁好谁坏,有的收敛速度慢,有的收敛速度快。

此处以MNIST数据集识别分类为例进行不同优化器的测试

1、梯度下降法:tf.train.GradientDescentOptimizer() 

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

#定义两个占位符(placeholder)
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]))
prediction = tf.nn.softmax(tf.matmul(x,w)+b)

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

#方法二:交叉熵代价函数(cross-entropy)的使用,加快收敛速度,迭代较少次数就能达到满意的效果
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=prediction))

#优化器的使用

#方法一:使用梯度下降法
train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)

#方法二:使用Adam方法
#train_step = tf.train.AdamOptimizer(1e-2).minimize(loss)





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

#结果存放在一个布尔型列表中
#equal中的两个值,若是一样,则返回True,否则返回False。argmax函数:返回最大值所在的索引值,即位置
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))
#求准确率
#将上一步的布尔类型转化为32位浮点型,即True转换为1.0,False转换为0.0,然后计算这些值的平均值作为准确率
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

#定义会话
with tf.Session() as sess:
    #初始化变量
    sess.run(init)
    #迭代21个周期
    for epoch in range(21):
        #n_batch:之前定义的批次
        for batch in range(n_batch):
            #获得100张图片,图片的数据保存在batch_xs中,图片的标签保存在batch_ys中
            batch_xs,batch_ys = mnist.train.next_batch(batch_size)
            #使用Feed操作,此步执行训练操作的op,将数据喂给他
            sess.run(train_step,feed_dict = {x:batch_xs,y:batch_ys})
        #训练一个周期后就可以看下准确率,使用Feed方法,此步执行计算准确度的op操作,将其对应的参数喂给它
        acc = sess.run(accuracy,feed_dict = {x:mnist.test.images,y:mnist.test.labels})
        print("Iter " + str(epoch) + ",Testing Accuracy " + str(acc))

训练测试结果:

Extracting MNIST_data/train-images-idx3-ubyte.gz
Extracting MNIST_data/train-labels-idx1-ubyte.gz
Extracting MNIST_data/t10k-images-idx3-ubyte.gz
Extracting MNIST_data/t10k-labels-idx1-ubyte.gz
Iter 0,Testing Accuracy 0.8237
Iter 1,Testing Accuracy 0.8902
Iter 2,Testing Accuracy 0.8997
Iter 3,Testing Accuracy 0.9048
Iter 4,Testing Accuracy 0.9089
Iter 5,Testing Accuracy 0.9107
Iter 6,Testing Accuracy 0.9119
Iter 7,Testing Accuracy 0.914
Iter 8,Testing Accuracy 0.9148
Iter 9,Testing Accuracy 0.9161
Iter 10,Testing Accuracy 0.9173
Iter 11,Testing Accuracy 0.9182
Iter 12,Testing Accuracy 0.9203
Iter 13,Testing Accuracy 0.9199
Iter 14,Testing Accuracy 0.9192
Iter 15,Testing Accuracy 0.9196
Iter 16,Testing Accuracy 0.9196
Iter 17,Testing Accuracy 0.9207
Iter 18,Testing Accuracy 0.9214
Iter 19,Testing Accuracy 0.9209
Iter 20,Testing Accuracy 0.9217

2、tf.train.AdamOptimizer()    优化器的使用

即将

#方法一:使用梯度下降法
train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)

换成

#方法二:使用Adam方法
train_step = tf.train.AdamOptimizer(1e-2).minimize(loss)

训练测试结果:

Extracting MNIST_data/train-images-idx3-ubyte.gz
Extracting MNIST_data/train-labels-idx1-ubyte.gz
Extracting MNIST_data/t10k-images-idx3-ubyte.gz
Extracting MNIST_data/t10k-labels-idx1-ubyte.gz
Iter 0,Testing Accuracy 0.917
Iter 1,Testing Accuracy 0.9242
Iter 2,Testing Accuracy 0.9287
Iter 3,Testing Accuracy 0.9287
Iter 4,Testing Accuracy 0.9285
Iter 5,Testing Accuracy 0.9317
Iter 6,Testing Accuracy 0.931
Iter 7,Testing Accuracy 0.9308
Iter 8,Testing Accuracy 0.9325
Iter 9,Testing Accuracy 0.929
Iter 10,Testing Accuracy 0.9293
Iter 11,Testing Accuracy 0.933
Iter 12,Testing Accuracy 0.9282
Iter 13,Testing Accuracy 0.9297
Iter 14,Testing Accuracy 0.9323
Iter 15,Testing Accuracy 0.9309
Iter 16,Testing Accuracy 0.9296
Iter 17,Testing Accuracy 0.9317
Iter 18,Testing Accuracy 0.9304
Iter 19,Testing Accuracy 0.9281
Iter 20,Testing Accuracy 0.9314

可见,在MNIST数据下,使用设计的神经网络,此种优化器性能较好。

猜你喜欢

转载自blog.csdn.net/gaoyu1253401563/article/details/86217766
今日推荐