2

私は現在、Courseraの教授Andrew Ngの "Machine Learning"コースの課題を取り直しています。私はLogistic Regressionの部分で立ち往生しています。GradientDescentOptimizerでNaNが生成されるのはなぜですか?

0.69314718056 
nan 
nan 
nan 

費用関数への最初の結果が正しいですが、次のものがあることになっている:

3.0133 
1.5207 
0.7336 

、代わりに私が手

filename = 'data/ex2data1.txt' 
data = np.loadtxt(filename, delimiter = ",", unpack = True) 

# Data matrices 
xtr = np.transpose(np.array(data[:-1])) 
ytr = np.transpose(np.array(data[-1:])) 

# Initial weights 
W = tf.Variable(tf.zeros([2,1], dtype = tf.float64)) 

# Bias 
b = tf.Variable(tf.zeros([1], dtype = tf.float64)) 

# Cost function 
y_ = tf.nn.sigmoid(tf.matmul(xtr,W) + b) 

cost = -tf.reduce_mean(ytr*tf.log(y_) + (1-ytr)*tf.log(1-y_)) 
optimize = tf.train.GradientDescentOptimizer(0.01).minimize(cost) 

corr = tf.equal(tf.argmax(ytr,1), tf.argmax(y_,1)) 
acc = tf.reduce_mean(tf.cast(corr, tf.float64)) 

init = tf.initialize_all_variables() 

with tf.Session() as sess: 
    sess.run(init) 
    print(sess.run(cost)) 
    for _ in range(3): 
     sess.run(optimize) 
     print(sess.run(cost)) 

この

は答えを作り出しますNaNの束。私は低い学習率を試してみましたが、無駄なことはありません。私は間違って何をしていますか? TensorFlowでこの割り当てを再現することは可能ですか?

PS:他のpythonソリューションはscipy.optimizeを使用しているようですが、TensorFlowの値でどのように使用するのか分かりません。可能な限りTensorFlowだけを使用したいと思います。

EDIT:tf.zerosの代わりにtf.onesとしてバイアスをかけてみましたが、うまくいきませんでした。

答えて

0

あなたの対数は入力をサニタイズしていません。負の入力値を持つと浮動小数点演算を素早くNaNできます。

What I did in Java code that makes heavy use of logs in similar domain:

  • NaNまたは無限の確認および負入力が、いくつかの静的番号などに出力をクリップ場合ゼロ
  • として出力すると仮定する。ログ(1E-5)〜= -11.51
  • そうでないだけTFに変換するために
  • は、そのコードは次のようになりますJavaでは

、難しいことではありませんログを取る:

public static double guardedLogarithm(double input) { 
    if (Double.isNaN(input) || Double.isInfinite(input)) { 
     return 0d; 
    } else if (input <= 0d || input <= -0d) { 
     // assume a quite low value of log(1e-5) ~= -11.51 
     return -10d; 
    } else { 
     return FastMath.log(input); 
    } 
    } 
関連する問題