2016-11-28 49 views
0

我是python和tensorflow的新手。在更好(可能)瞭解DNN和它的數學後。我開始學習通過練習來使用張量流。Tensorflow多層感知器圖形不會收斂

我的一個練習是預測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