一、tensorflow常用的优化器
关于优化方法请查看:神经网络DNN —— 优化算法。
前面模型训练的的优化方法一直用的都是普通的梯度下降法,对应的优化器为tf.train.GradientDescentOptimizer,在tensorflow中优化器属于class tf.train.Optimizer的子类,下面介绍一下另外三种常用的优化器(分别为Momentum、RMSprop、Adam):
1、tf.train.MomentumOptimizer.__init__(learning_rate, momentum, use_locking=False, name='Momentum')
- learning_rate:学习率,数据类型为tensor或float。
- momentum:动量参数,Momentum指数加权的超参数,数据类型为tensor或float。
- use_locking:若为true,则锁定更新。
- name:优化器名字。
2、tf.train.RMSPropOptimizer.__init__(learning_rate, decay=0.9, momentum=0.0, epsilon=1e-10, use_locking=False, name='RMSProp')
- learning_rate:学习率,数据类型为tensor或float。
- decay:Rmsprop平方加权的超参数,历史梯度的衰减量。
- momentum:一个标量tensor,我也不知道这个参数干嘛的。
- epsilon:极小的值,防止分母为0。
- use_locking:若为true,则锁定更新。
- name:优化器名字。
3、tf.train.AdamOptimizer.__init__(learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08, use_locking=False, name='Adam')
- learning_rate:学习率,数据类型为tensor或float。
- beta1:Momentum指数加权的超参数。
- beta2:Rmsprop平方加权的超参数。
- epsilon:极小的值,防止分母为0。
- use_locking:若为true,则锁定更新。
- name:优化器名字。
这三个类有一个函数minimize(loss),一般搭配使用,例如tf.train.GradientDescentOptimizer(0.1).minimize(loss)提供一个loss参数就可以实现梯度下降的方法。其余的优化器可以在官方文档的tf.train中查看。
二、代码示例
import tensorflow as tf import numpy as np #创造数据集 x_data=np.linspace(-1,1,10000).reshape(10000,1) y_data=2*x_data**2+3 #占位符 x_p=tf.placeholder(tf.float32) y_p=tf.placeholder(tf.float32) #定义第一个隐藏层Layer1,输入为x有5个神经元,无激活函数 weights1=tf.Variable(tf.ones([1,5])) biases1=tf.Variable(tf.zeros([1,5])+0.001) input1=tf.matmul(x_p,weights1)+biases1 #定义输出层,输入为input1,激活函数为tahn weights2=tf.Variable(tf.random_normal([5,1])) biases2=tf.Variable(tf.zeros([1,5])+0.001) prediction=tf.nn.tanh(tf.matmul(input1,weights2)+biases2) #定义损失函数,loss=均方差+正则化项 loss=tf.reduce_mean(tf.square(y_p-prediction)) #定义优化方式为梯度下降 Gradient=tf.train.GradientDescentOptimizer(0.1).minimize(loss) Momentum=tf.train.MomentumOptimizer(0.1,0.9).minimize(loss) RMSprop=tf.train.RMSPropOptimizer(0.1,0.9).minimize(loss) Adam=tf.train.AdamOptimizer(0.001,0.9,0.999).minimize(loss) init=tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) #普通梯度训练200次,每隔10次输出一次loss print('\nloss for Gradient:') for i in range(200): sess.run(Gradient,feed_dict={x_p:x_data,y_p:y_data}) if i % 9 == 0: print(sess.run(loss,feed_dict={x_p:x_data,y_p:y_data})) print('\nloss for Momentum:') # Momentum梯度训练200次,每隔10次输出一次loss for i in range(200): sess.run(Momentum, feed_dict={x_p: x_data, y_p: y_data}) if i % 9 == 0: print(sess.run(loss, feed_dict={x_p: x_data, y_p: y_data})) print('\nloss for RMSprop:') # RMSprop梯度训练200次,每隔10次输出一次loss for i in range(200): sess.run(RMSprop, feed_dict={x_p: x_data, y_p: y_data}) if i % 9 == 0: print(sess.run(loss, feed_dict={x_p: x_data, y_p: y_data})) print('\nloss for Adam:') # Adam梯度训练200次,每隔10次输出一次loss for i in range(200): sess.run(Adam, feed_dict={x_p: x_data, y_p: y_data}) if i % 9 == 0: print(sess.run(loss, feed_dict={x_p: x_data, y_p: y_data}))