梯度下降法
Momentum
tf.train.MomentumOptimizer(learning_rate, momentum, use_locking=False, name='Momentum').minimize(loss)
learning_rate:学习率,数据类型为tensor或float。
momentum:动量参数,Momentum指数加权的超参数,数据类型为tensor或float。
use_locking:若为true,则锁定更新。 name:优化器名字。
RMSprop
tf.train.RMSPropOptimizer(learning_rate, decay=0.9, momentum=0.0, epsilon=1e-10, use_locking=False, name='RMSProp').minimize(loss)
learning_rate:学习率,数据类型为tensor或float。 decay:Rmsprop平方加权的超参数,历史梯度的衰减量。
momentum:一个标量tensor,我也不知道这个参数干嘛的。
epsilon:极小的值,防止分母为0。
use_locking:若为true,则锁定更新。 name:优化器名字。
Adam
tf.train.AdamOptimizer(learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08, use_locking=False, name='Adam').minimize(loss)
learning_rate:学习率,数据类型为tensor或float。
beta1:Momentum指数加权的超参数。
beta2:Rmsprop平方加权的超参数。 epsilon:极小的值,防止分母为0。 use_locking:若为true,则锁定更新。
name:优化器名字。
代码示例
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}))