2016-11-28 10 views
0

私はpythonとtensorflowを初めて使用しています。より良い(多分)DNNとその数学を理解した後。私はエクササイズでテンソルフローを使うことを学び始めます。Tensorflow多層パーセプトロングラフが収束しない

私の練習の1つは、x^2を予測することです。それは、細かい訓練を受けた後である私が5.0を与えると25.0を予測します。

パラメータと設定:

コスト関数= E((Y-Y ')^ 2)

二つの隠れ層と、彼らが完全に接続されています。

learning_rate = 0.001

n_hidden_​​1 = 3

n_hidden_​​2 = 2

n_input = 1

しかしn_output = 1

def multilayer_perceptron(x, weights, biases): 
    # Hidden layer with RELU activation 
    layer_1 = tf.add(tf.matmul(x, weights['h1']), biases['b1']) 
    layer_1 = tf.nn.relu(layer_1) 
    # Hidden layer with RELU activation 
    layer_2 = tf.add(tf.matmul(layer_1, weights['h2']), biases['b2']) 
    layer_2 = tf.nn.relu(layer_2) 
    # Output layer with linear activation 
    out_layer = tf.matmul(layer_2, weights['out']) + biases['out'] 
    return out_layer 

def generate_input(): 
    import random 

    val = random.uniform(-10000, 10000) 
    return np.array([val]).reshape(1, -1), np.array([val*val]).reshape(1, -1) 


# tf Graph input 
# given one value and output one value 
x = tf.placeholder("float", [None, 1]) 
y = tf.placeholder("float", [None, 1]) 
pred = multilayer_perceptron(x, weights, biases) 

# Define loss and optimizer 
distance = tf.sub(pred, y) 
cost = tf.reduce_mean(tf.pow(distance, 2)) 
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost) 

init = tf.initialize_all_variables() 

# Launch the graph 
with tf.Session() as sess: 
    sess.run(init) 
    avg_cost = 0.0 

    for iter in range(10000): 
     inp, ans = generate_input() 
     _, c = sess.run([optimizer, cost], feed_dict={x: inp, y: ans}) 
     print('iter: '+str(iter)+' cost='+str(c)) 

、結局のところ、そのC時々大きくなり、時には低くなります。 (しかしそれは大きい)

答えて

2

val = random.uniform(-10000, 10000)のステートメントのために、トレーニングデータが大きな範囲を占めているように見えるため、トレーニングの前にいくつかのデータ前処理を実行してください。例えば、損失値については

val = random.uniform(-10000, 10000) 
val = np.asarray(val).reshape(1, -1) 
val -= np.mean(val, axis=0) 
val /= np.std(val, axis=0) 

は、それが時にはそれが大きくなること大丈夫です、そして時には低く、単に一般的にエポックの増加を訓練する際の損失が減少していることを確認してください。 PS:SGDオプティマイザをよく使用しています。

+0

は、コスト関数についての私のコードですか? E((y-y ')^ 2) –

+0

ありがとう、私は今平均コストを使用し、私はそれが降下するのを見ます。入力を拡大する理由は、費用関数がうまく機能するためですか?私は正しい?入力値の範囲が大きすぎる場合。許容されてもコストは大きくなる。例えば100^2 = 10000とし、それは9800を予測する。コストは200^2となる。ただし、コスト関数を変更するとオプティマイザを変更する必要があります。これまでのところ私の理解です。私が間違っている場合私を修正してください。 –

+0

はい、大きな値が収束するまでにもっと時間がかかります。オプティマイザについては、異なるコスト関数で同じオプティマイザを使用できますが、一般的には単純化のためにSGDを選択しています。 – daoliker

関連する問題