博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Tensorflow--梯度及梯度下降法
阅读量:4510 次
发布时间:2019-06-08

本文共 6559 字,大约阅读时间需要 21 分钟。

Tensorflow–梯度及梯度下降法

一.梯度

Tensorflow通过函数gradients(ys,xs,grad_ys=None,name=“gradients”)实现自动计算梯度,代码如下:

import tensorflow as tfimport numpy as npx=tf.placeholder(tf.float32,(2,1))w=tf.constant([[3,4]],tf.float32)y=tf.matmul(w,x)F=tf.pow(y,2)grades=tf.gradients(F,x)session=tf.Session()print(session.run(grades,{
x:np.array([[2],[3]])}))
[array([[ 108.],       [ 144.]], dtype=float32)]

二.导数计算的链式法则

1.梯度下降法

一元函数的梯度下降法

梯度下降法是求解凸函数无约束最优化问题常用的方法,其中η常称为学习率
求:f(x)=(x-1)的最小值点

初始化:x1=4,η=0.25

第一次迭代:x2=x1-ηf’(x1)=4-0.25_2_(4-1)=2.5
第二次迭代:x3=x2-ηf’(x2)=2.5-0.25_2_(2.5-1)=1.75
第三次迭代:x4=x3-ηf’(x3)=1.75-0.25_2_(1.75-1)=1.375

Tensorflow通过函数tf.train.GradientDescentOptimizer(learning_rate,use_locking=False,name=“GradientDescent”)实现以上梯度下降法,利用该函数实现以上示例的迭代过程

import tensorflow as tfx=tf.Variable(4.0,dtype=tf.float32)y=tf.pow(x-1,2.0)# 梯度下降,学习率设置为0.25opti=tf.train.GradientDescentOptimizer(0.25).minimize(y)session=tf.Session()session.run(tf.global_variables_initializer())# 三次迭代for i in range(3):    session.run(opti)        print(session.run(x))
2.51.751.375

其中学习率η=0.25设置得比较大,最好设置得小一点,否则会在最小值附近震荡,稍微修改以上程序,令学习率η=0.05,迭代100次,每次打印当前寻找的点

import tensorflow as tfimport matplotlib.pyplot as pltimport numpy as npimport mathx=tf.Variable(15.0,dtype=tf.float32)y=tf.pow(x-1,2.0)opti=tf.train.GradientDescentOptimizer(0.05).minimize(y)value=np.arange(-15,17,0.01)y_value=np.power(value-1,2.0)plt.plot(value,y_value)session=tf.Session()session.run(tf.global_variables_initializer())for i in range(100):    session.run(opti)        if(i%10==0):        v=session.run(x)        plt.plot(v,math.pow(v-1,2.0),"go")        print("第%d次的x的迭代值:%f"%(i+1,v))        plt.show()
第1次的x的迭代值:13.600000第11次的x的迭代值:5.393349第21次的x的迭代值:2.531866第31次的x的迭代值:1.534129第41次的x的迭代值:1.186239第51次的x的迭代值:1.064938第61次的x的迭代值:1.022642第71次的x的迭代值:1.007895第81次的x的迭代值:1.002753第91次的x的迭代值:1.000960

output_6_1.png

多元函数的梯度下降法

f(x1,x2)=x1+x2

import tensorflow as tfx1=tf.Variable(-4.0,dtype=tf.float32)x2=tf.Variable(4.0,dtype=tf.float32)y=tf.square(x1)+tf.square(x2)session=tf.Session()session.run(tf.global_variables_initializer())opti=tf.train.GradientDescentOptimizer(0.25).minimize(y)for i in range(2):    session.run(opti)        print((session.run(x1),session.run(x2)))
(-2.0, 2.0)(-1.0, 1.0)

采用矩阵的形式组织变量

import tensorflow as tfx=tf.Variable(tf.constant([-4,4],tf.float32),tf.float32)y=tf.reduce_sum(tf.square(x))session=tf.Session()session.run(tf.global_variables_initializer())opti=tf.train.GradientDescentOptimizer(0.25).minimize(y)for i in range(2):    session.run(opti)        print(session.run(x))
[-2.  2.][-1.  1.]

利用Tensorflow对某一函数进行梯度下降,主要分为如下三步:

1.利用Variable类初始化自变量的值
2.构造出函数
3.利用函数GradientDescentOptimizer进行梯度下降法操作

三.梯度下降法

1.Adagrad法

f(x1,x2)=x1+x2

Tensorflow通过函数tf.train.AdagradOptimizer(learning_rate=0.001,initial_accumulator_value=0.1)实现Adagrad梯度下降

import tensorflow as tfx=tf.Variable(tf.constant([[4],[3]],tf.float32),dtype=tf.float32)w=tf.constant([[1,2]],tf.float32)y=tf.reduce_sum(tf.matmul(w,tf.square(x)))opti=tf.train.AdagradOptimizer(0.25,0.1).minimize(y)session=tf.Session()init=tf.global_variables_initializer()session.run(init)for i in range(3):    session.run(opti)        print(session.run(x))
[[ 3.75019503] [ 2.75008678]][[ 3.57927608] [ 2.58118463]][[ 3.4426589 ] [ 2.44730377]]

2.Momentum法

import tensorflow as tfx=tf.Variable(tf.constant([[4],[3]],tf.float32),dtype=tf.float32)w=tf.constant([[1,2]],tf.float32)y=tf.reduce_sum(tf.matmul(w,tf.square(x)))opti=tf.train.MomentumOptimizer(0.01,0.9).minimize(y)session=tf.Session()init=tf.global_variables_initializer()session.run(init)for i in range(2):    session.run(opti)        print(session.run(x))
[[ 3.92000008] [ 2.88000011]][[ 3.76960015] [ 2.65680003]]

3.NAG法

Tensorflow通过函数MomentumOptimizer实现Momentum法,该函数中有一个参数use_nesterov,只要将该参数设置为True,就是Tensorflow实现的NAG法
import tensorflow as tfx=tf.Variable(tf.constant([[4],[3]],tf.float32),dtype=tf.float32)w=tf.constant([[1,2]],tf.float32)y=tf.reduce_sum(tf.matmul(w,tf.square(x)))opti=tf.train.MomentumOptimizer(0.01,0.9,use_nesterov=True).minimize(y)session=tf.Session()init=tf.global_variables_initializer()session.run(init)for i in range(2):    session.run(opti)        print(session.run(x))
[[ 3.84800005] [ 2.77200007]][[ 3.636976  ] [ 2.46412802]]

4.RMSprop法

Tensorflow的实现代码如下:

opti=tf.train.RMSPropOptimizer(learning_rate=0.01,decay=0.9,epsilon=1e-10).minimize(y)
import tensorflow as tfx=tf.Variable(tf.constant([[4],[3]],tf.float32),dtype=tf.float32)w=tf.constant([[1,2]],tf.float32)y=tf.reduce_sum(tf.matmul(w,tf.square(x)))opti=tf.train.RMSPropOptimizer(learning_rate=0.01,decay=0.9,epsilon=1e-10).minimize(y)session=tf.Session()init=tf.global_variables_initializer()session.run(init)for i in range(2):    session.run(opti)        print(session.run(x))
[[ 3.97039056] [ 2.96932149]][[ 3.94826055] [ 2.94682598]]

5.具备动量的RMSprop法是RMSprop和Momentum结合的方法

Tensorflow的实现代码如下:

tf.train.RMSPropOptimizer(learning_rate=0.01,decay=0.9,momentum=0.9,epsilon=1e-10).minimize(y)
import tensorflow as tfx=tf.Variable(tf.constant([[4],[3]],tf.float32),dtype=tf.float32)w=tf.constant([[1,2]],tf.float32)y=tf.reduce_sum(tf.matmul(w,tf.square(x)))opti=tf.train.RMSPropOptimizer(learning_rate=0.01,decay=0.9,momentum=0.9,epsilon=1e-10).minimize(y)session=tf.Session()init=tf.global_variables_initializer()session.run(init)for i in range(2):    session.run(opti)        print(session.run(x))
[[ 3.97039056] [ 2.96932149]][[ 3.92161226] [ 2.91921544]]

6.Adadelta法

Tensorflow通过函数:

tf.train.AdadeltaOptimizer(learning_rate=0.001,rho=0.95,epsilon=1e-8).minimize(y)
import tensorflow as tfx=tf.Variable(tf.constant([[4],[3]],tf.float32),dtype=tf.float32)w=tf.constant([[1,2]],tf.float32)y=tf.reduce_sum(tf.matmul(w,tf.square(x)))opti=tf.train.AdadeltaOptimizer(learning_rate=0.001,rho=0.95,epsilon=1e-8).minimize(y)session=tf.Session()init=tf.global_variables_initializer()session.run(init)for i in range(2):    session.run(opti)        print(session.run(x))
[[ 3.99999928] [ 2.99999928]][[ 3.99999881] [ 2.99999881]]

7.Adam法

tf.train.AdamOptimizer(learning_rate=0.001,beta1=0.9,beta2=0.999,epsilon=1e-8)
import tensorflow as tfx=tf.Variable(tf.constant([[4],[3]],tf.float32),dtype=tf.float32)w=tf.constant([[1,2]],tf.float32)y=tf.reduce_sum(tf.matmul(w,tf.square(x)))opti=tf.train.AdamOptimizer(learning_rate=0.001,beta1=0.9,beta2=0.999,epsilon=1e-8).minimize(y)session=tf.Session()init=tf.global_variables_initializer()session.run(init)for i in range(2):    session.run(opti)        print(session.run(x))
[[ 3.99900007] [ 2.99900007]][[ 3.99800014] [ 2.99800014]]

转载于:https://www.cnblogs.com/LQ6H/p/10331439.html

你可能感兴趣的文章
XtraGrid判断列有没有显示
查看>>
MySQL系列--3.数据类型和连接查询
查看>>
servlet的url-pattern匹配规则详细描述
查看>>
jquery 进度条
查看>>
《BI那点儿事》数据流转换——查找转换
查看>>
二叉树中和为某一值的路径
查看>>
07_组件三大属性(1)_state
查看>>
学习PYTHON之路, DAY 3 - PYTHON 基础 3 (函数)
查看>>
Leetcode 416.分割等和子集
查看>>
java8 lambda 表达式
查看>>
【转】提示框第三方库之MBProgressHUD iOS toast效果 动态提示框效果
查看>>
JS对象和JSON字符串相互转化总结
查看>>
Ajax
查看>>
poj1019——log10求位数
查看>>
xdoj1065 Efficent Allocation 动态开点的线段树
查看>>
css默认值汇总
查看>>
IE兼容CSS3圆角border-radius的方法(同时兼容box-shadow,text-shadow)
查看>>
转 CSS兼容性(IE和Firefox)技巧大全 (二)
查看>>
jQuery源码分析:jQuery对象属性设置(attr、access、$.attr)源代码分析
查看>>
不同web应用登录方案
查看>>