tensorflow求导和梯度计算

241 阅读1分钟

1.函数求一阶导



  • import
    tensorflow
    as
    tf



  • tf.enable_eager_execution()



  • tfe=tf.contrib.eager



  • from
    math
    import
    pi



  • def f(x):



  • return
    tf.square(tf.sin(x))



  • assert
    f(pi/
    2
    ).numpy()==
    1.0




  • sess=tf.Session()



  • grad_f=tfe.gradients_function(f)



  • print(grad_f(np.zeros(
    1
    ))[
    0
    ].numpy())


2.高阶函数求导



  • import
    numpy
    as
    np



  • def f(x):



  • return
    tf.square(tf.sin(x))







  • def grad(f):



  • return
    lambda
    x:tfe.gradients_function(f)(x)[
    0
    ]







  • x=tf.lin_space(
    -2
    *pi,
    2
    *pi,
    100
    )



  • # print(grad(f)(x).numpy())




  • x=x.numpy()



  • import
    matplotlib.pyplot
    as
    plt



  • plt.plot(x,f(x).numpy(),label=
    "f"
    )



  • plt.plot(x,grad(f)(x).numpy(),label=
    "first derivative"
    )
    #一阶导




  • plt.plot(x,grad(grad(f))(x).numpy(),label=
    "second derivative"
    )
    #二阶导




  • plt.plot(x,grad(grad(grad(f)))(x).numpy(),label=
    "third derivative"
    )
    #三阶导




  • plt.legend()



  • plt.show()





  • def f(x,y):



  • output=
    1




  • for
    i
    in
    range(int(y)):



  • output=tf.multiply(output,x)



  • return
    output







  • def g(x,y):



  • return
    tfe.gradients_function(f)(x,y)[
    0
    ]







  • print(f(
    3.0
    ,
    2
    ).numpy())
    #f(x)=x^2




  • print(g(
    3.0
    ,
    2
    ).numpy())
    #f'(x)=2*x




  • print(f(
    4.0
    ,
    3
    ).numpy())
    #f(x)=x^3




  • print(g(
    4.0
    ,
    3
    ).numpy())
    #f(x)=3x^2



3.函数求一阶偏导



  • x=tf.ones((
    2
    ,
    2
    ))



  • with
    tf.GradientTape(persistent=
    True
    )
    as
    t:



  • t.watch(x)



  • y=tf.reduce_sum(x)



  • z=tf.multiply(y,y)







  • dz_dy=t.gradient(z,y)



  • print(dz_dy.numpy())



  • dz_dx=t.gradient(z,x)



  • print(dz_dx.numpy())



  • for
    i
    in
    [
    0
    ,
    1
    ]:



  • for
    j
    in
    [
    0
    ,
    1
    ]:



  • print(dz_dx[j].numpy() )


4.函数求二阶偏导



  • x=tf.constant(
    2.0
    )



  • with
    tf.GradientTape()
    as
    t:



  • with
    tf.GradientTape()
    as
    t2:



  • t2.watch(x)



  • y=x*x*x



  • dy_dx=t2.gradient(y,x)



  • d2y_dx2=t.gradient(dy_dx,x)







  • print(dy_dx.numpy())



  • print(d2y_dx2.numpy())


更多免费技术资料可关注:annalin1203