2017-03-05 7 views
0

に立ち往生tensorflowを使用して、単一ニューロンでの実装と機能である:バックプロパゲーションアルゴリズムは、ここでのトレーニングと機能

def tf_sigmoid(x): 
    return 1/(1 + tf.exp(-x)) 

data = [ 
    (0, 0), 
    (0, 1), 
    (1, 0), 
    (1, 1), 
] 

labels = [ 
    0, 
    0, 
    0, 
    1, 
] 

n_steps = 1000 
learning_rate = .1 

x = tf.placeholder(dtype=tf.float32, shape=[2]) 
y = tf.placeholder(dtype=tf.float32, shape=None) 

w = tf.get_variable('W', shape=[2], initializer=tf.random_normal_initializer(), dtype=tf.float32) 
b = tf.get_variable('b', shape=[], initializer=tf.random_normal_initializer(), dtype=tf.float32) 

h = tf.reduce_sum(x * w) + b 
output = tf_sigmoid(h) 

error = tf.abs(output - y) 
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(error) 
sess.run(tf.initialize_all_variables()) 


for step in range(n_steps): 
    for i in np.random.permutation(range(len(data))): 
     sess.run(optimizer, feed_dict={x: data[i], y: labels[i]}) 

時にはそれが完璧に動作しますが、いくつかのパラメータにそれが立ち往生し、したくありません学ぶ。例えば、これらの初期パラメータでは:

w = tf.Variable(initial_value=[-0.31199348, -0.46391705], dtype=tf.float32) 
b = tf.Variable(initial_value=-1.94877, dtype=tf.float32) 

コスト関数の改善はほとんどありません。私は間違って何をしていますか、多分私は何とかパラメータの初期化を調整する必要がありますか?

答えて

1

mean(error)がありませんか?

問題は、シグモイド、コスト関数、およびオプティマイザの特定の組み合わせです。

AFAIKこの正確な問題は、フィールド全体がで数年間ストールしています。

あなたが真ん中から遠いときは、Sigmoidはフラットで、比較的大きな数の、try/1000で初期化しています。

あなたのabsエラー(または二乗誤差)もフラットなので、GradientDescentオプティマイザはスロープに比例したステップをとります。

これらのいずれかがそれを修正する必要があります

使用cross-entropyエラーのために - それは凸です。

Adam のような最適なオプティマイザを使用してください。ステップサイズはスロープに依存しません。斜面の一貫性に関する詳細。

ボーナス:自分のシグモイドをロールしないでください。tf.nn.sigmoidを使用すると、NaNの数が大幅に減ります。

楽しくお楽しみください!

+0

これはすばらしい答えです、ありがとう! (バッチを使わないので意味がないと思うので平均はない) –