私はその微分値を得るためにこの関数を持っていました。
def dp1_f1(x):
return 64*x*(1-x)*(math.pow((1-2*x),2) )*math.pow((1-8*x+8*x*x), 2)
dy/dx
価値を手に入れたい。この値は、次のように数値法で取得できます。
def dp_numeric_diff(x):
delta_x = 0.0001
return (dp1_f1(x+delta_x)-dp1_f1(x))/delta_x
TensorFlowの熱心な実行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]
私はこの関数を以下のコードで呼び出します:
numeric_diff = dp_numeric_diff(x)
print('Numeric method:{0}'.format(numeric_diff))
v, d = dp_ad_tfe(x)
print('TFE:{0}'.format(d))
次のように表示されます。
Numeric method:-75290405.66440672
TFE:-19208000.0
数値法は正しいと確信しています。TensorFlowの熱心な実行コードの何が問題になっていますか?ちなみに、同じTensorFlowの熱心な実行コードは、x ^ 2のような単純な関数に対して正しい答えを得ることができます。
TensorFlowの自動微分APIは、TensorFlow操作の構成によってのみ区別できmath.pow()
、他のライブラリなどの関数では区別できません。あなたが交換した場合math.pow()
にtf.pow()
それがうまく出て動作するはずです。
何かのようなもの:
import tensorflow as tf
tf.enable_eager_execution()
def dp1_f1(x):
return 64*x*(1-x)*(tf.pow((1-2*x),2) )*tf.pow((1-8*x+8*x*x), 2)
def dp_numeric_diff(x):
delta_x = 0.0001
return (dp1_f1(x+delta_x)-dp1_f1(x))/delta_x
grad = tf.contrib.eager.gradients_function(dp1_f1)
print(dp_numeric_diff(3.0).numpy()) # Prints -75300000.0
print(grad(3.0)[0].numpy()) # Prints -75279680.0
それがお役に立てば幸いです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加