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()
テンソルフローが自動的にバックを完全に伝播するかどうかはわかりません。私は本当に自分自身でバックプロパゲーションを実装したくありません。私のコードについて何か間違っていますか?ご協力いただきありがとうございます!
バックの小道具を完成させているように見えますが、非常に練習しているようには見えません。具体的には、トレーニングループは各データポイントを1回だけ通過します。多くの反復を見るのが一般的です。私はあなたのコードを実行し、可能な限り単純な作業スクリプトに入れればそれを修正しようとしています。例えば、あなたの質問の一部ではない保存やその他の不要なコードを取り除く。 – Wontonimo
ありがとうございました。コードはhttps://github.com/xiaoyangzai/test/blob/master/back_propagate.pyにあります。もう一度ありがとうございます! – WangYang
もう一度!私はループ1000回で把握している!非常に非常に非常にありがとう!ありがとうございました !! – WangYang