2017-05-23 8 views
0

私はTensorflowの新入生です。最近、私は、2層ニューラルネットワークモデルで、非線形関数 "y = 1 + sin(x * pi/4)"を適合させたいと考えています。プログラムのコードは次のとおりです:Tensorflowで逆伝播が機能しない

#!/usr/bin/python 

    import tensorflow as tf 
    import numpy as np 
    import math 
    import matplotlib.pyplot as plt 

    def check_mode(): 
     x_data = np.linspace(-2,2,100) 
     y_data = [1 + math.sin(x * math.pi/4) for x in x_data] 
     w_1 = tf.Variable(tf.random_uniform([1,2],0,0.5)) 
     b_1 = tf.Variable(tf.random_uniform([1,2],0,0.5)) 
     w_2 = tf.Variable(tf.random_uniform([2,1],0,0.5)) 
     b_2 = tf.Variable(tf.random_uniform([1,1],0,0.5)) 
     saver = tf.train.Saver() 
     with tf.Session() as sess: 
      saver.restore(sess,"mode.ckpt") 
      print("lay1: ",sess.run(w_1),sess.run(b_1)) 
      print("lay2: ",sess.run(w_2),sess.run(b_2)) 
      a = [] 
      for x_i in x_data: 
       w_plus_b = tf.matmul([[x_i]],w_1) + b_1 
       a_1 = sigma(w_plus_b) 
       a_2 = tf.matmul(a_1,w_2) + b_2 
       a.append(sess.run(a_2[0][0])) 
     print a 
     draw_point(a,x_data,y_data) 
     return 
    def draw_point(a,x_data,y_data): 
     fx,ax = plt.subplots() 
     plt.plot(x_data,y_data,'o-') 
     plt.plot(x_data,a,'k-') 
     plt.show() 


    def sigma(x): 
     return tf.div(tf.constant(1.0),tf.add(tf.constant(1.0),tf.exp(tf.negative(x)))) 

    def first_function(): 
     x_data = np.linspace(-2,2,100) 
     y_data = [1 + math.sin(x * math.pi/4) for x in x_data] 

     x_i = tf.placeholder(tf.float32,[1,1]) 
     y_data_i = tf.placeholder(tf.float32,[1,1]) 

     w_1 = tf.Variable(tf.random_uniform([1,2],0,0.5)) 
     b_1 = tf.Variable(tf.random_uniform([1,2],0,0.5)) 

     w_2 = tf.Variable(tf.random_uniform([2,1],0,0.5)) 
     b_2 = tf.Variable(tf.random_uniform([1,1],0,0.5)) 

     z_1 = tf.add(tf.matmul(x_i,w_1), b_1) 
     a_1 = sigma(z_1) 
     a_2 = tf.add(tf.matmul(a_1,w_2),b_2) 
     diff = tf.subtract(a_2,y_data_i)  

     loss = tf.multiply(diff,diff) 

     optimizer = tf.train.GradientDescentOptimizer(0.1) 
     train = optimizer.minimize(loss) 

     init = tf.initialize_all_variables() 

     sess = tf.Session() 
     sess.run(init) 
     saver = tf.train.Saver() 
     for step in range(100): 
      sess.run(train,feed_dict={x_i:[[x_data[step]]],y_data_i:[[y_data[step]]]}) 

     print("lay1: ",sess.run(w_1),sess.run(b_1)) 
     print("lay2: ",sess.run(w_2),sess.run(b_2)) 
     saver.save(sess,"mode.ckpt") 
     return 

    def main(): 
     #first_function() 
     check_mode() 
     return 

    if __name__ == '__main__': 
     main() 

テンソルフローが自動的にバックを完全に伝播するかどうかはわかりません。私は本当に自分自身でバックプロパゲーションを実装したくありません。私のコードについて何か間違っていますか?ご協力いただきありがとうございます!

+0

バックの小道具を完成させているように見えますが、非常に練習しているようには見えません。具体的には、トレーニングループは各データポイントを1回だけ通過します。多くの反復を見るのが一般的です。私はあなたのコードを実行し、可能な限り単純な作業スクリプトに入れればそれを修正しようとしています。例えば、あなたの質問の一部ではない保存やその他の不要なコードを取り除く。 – Wontonimo

+0

ありがとうございました。コードはhttps://github.com/xiaoyangzai/test/blob/master/back_propagate.pyにあります。もう一度ありがとうございます! – WangYang

+0

もう一度!私はループ1000回で把握している!非常に非常に非常にありがとう!ありがとうございました !! – WangYang

答えて

1

バックの小道具を完成させているように見えますが、とても練習しているようには見えません。具体的には、トレーニングループは各データポイントを1回だけ通過します。データを通して多くのループを試してみてください。

関連する問題