微信北京赛车源码下载搭建

微信北京赛车源码下载搭建

http://hubawl.com

程序中可以定义为:

@tf.custom_gradient
def f3(x, n): v = tf.pow(x, n) def grad(dy): return (dy* (n*tf.pow(x, n-1)) ).numpy() return v.numpy(), grad def dp1_f1(x): return 64*x*(1-x)*f3(1-2*x,2)*f3(1-8*x+8*x*x, 2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这里需要特别注意,TensorFlow Eager Execution API不能处理诸如math.pow这类函数的导数,因此需要我们定义新的函数,告诉TensorFlow怎样求导,所以我们定义了f3函数,并定义了其导数的计算方法。 
- 数值方法 
我们知道在高等数学中,对函数y=f(x)的导数定义为: 

 
dydx=limΔx0f(x+Δx)f(x)Δxdydx=limΔx→0f(x+Δx)−f(x)Δx


根据这个定义,我们可以求任意复杂函数的导数,但是对于复杂的尤其是多维函数,由于计算机数字表示的有限精度问题,这种方式存在运算量大而且精度不高的问题,通常只用于验证我们用其他方法求出的微分值的正确性。

def dp_numeric_diff(x):
    delta_x = 0.0001 return (dp1_f1(x+delta_x)-dp1_f1(x))/delta_x
  • 1
  • 2
  • 3
  • 符号微分法 
    这种方法的核心是通过人工求出函数的微分的解析式,然后编制为程序,最后通过程序来计算函数的微分值。这种方式的精度最高,但是通常函数微分解析式非常复杂,求解过程中极易出错,同时这种方式仅适合可以写出解析式的情况,对于隐式方程形式,就无法求解了。 
    我们可以求出导数的解析表达式为: 
     
    dydx=128x(1x)(8+16x)(12x)2+64(1x)(12x)2(18x+8x2)264x(12x)2(18x+8x2)2256x(1x)(12x)(18x+8x2)2dydx=128x(1−x)(−8+16x)(1−2x)2+64(1−x)(1−2x)2(1−8x+8x2)2−64x(1−2x)2(1−8x+8x2)2−256x(1−x)(1−2x)(1−8x+8x2)2

    具体的程序实现为:
def dp_symbolic_diff(x):
    return 128*x*(1 - x)*(-8 + 16*x)*( math.pow((1 - 2*x), 2) )* (1 - 8*x + 8*x*x)+ (64*x* math.pow((1 -2*x), 2) )*math.pow((1 - 8*x + 8*x*x), 2) - 256*x*(1 - x)*(1 - 2*x)*math.pow((1 - 8*x+ 8*x*x), 2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 自动微分 
    下面我们来用自动微分方法来求解这个问题。首先我们画出这个问题对应的计算图,如下图所示: 
    这里写图片描述

图中的l1就是自变量x,根据定义可知l2=4l1(1l1)l2=4⋅l1⋅(1−l1),我们一方面可以根据这个值求出l2l2 的值,同时也可以求出 

 
dl2dl1=(4l1(1l1))=(4l14l21)=4l18l1l1dl2dl1=(4⋅l1⋅(1−l1))′=(4⋅l1−4⋅l12)′=4l1′−8l1l1′


其余过程以此类推。 
根据上面的计算图,我们采用普通的Python程序即可计算出导数值:

def dp_ad_python(x):
    (v, dv) = (x, 1) for i in range(3): (v, dv) = (4*v*(1-v), 4*dv-8*v*dv) return (v, dv)
  • 1
  • 2
  • 3
  • 4
  • 5

运行以上程序,计算结果为: 
这里写图片描述

如图所示,符号微分和自动微分算出的结果是一致的,而数据微分的结果与其略有不同,说明数值微分还是有误差的。 
如果采用TensorFlow Eager Execution API来进行计算,代码如下所示:

def dp_ad_tfe(x):
    #tf.enable_eager_execution() tfe = tf.contrib.eager grad_lx = tfe.gradients_function(dp1_f1) x = 3.0 y = dp1_f1(x) rst = grad_lx(x) return y, rst[0]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

我们采用如下代码来调用这些微分方法:

def test(args={}):
    x = 3.0 y = dp1_f1(x) print('函数值:{0}'.format(y)) numeric_diff = dp_numeric_diff(x) print('数值微分:{0}'.format(numeric_diff)) symbolic_diff = dp_symbolic_diff(x) print('符号微分:{0}'.format(symbolic_diff)) y, dv = dp_ad_python(x) print('自动微分:{0}'.format(dv)) v, d = dp_ad_tfe(x) print('TFE:{0}'.format(d))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

其结果如下所示: 
这里写图片描述 
由此可以看出,采用符号微分、纯Python自动微分、TensorFlow Eager Execution API求出的结果是一致的,都是比较精确的结果,而数值微分的结果会有一定的误差。

猜你喜欢

转载自www.cnblogs.com/sdfsd25121/p/9203079.html