2017-07-06 60 views
0

我正在嘗試學習Tensorflow。我正在做一個基本的例子 - 爲方程y = x + 0.1建模,使用神經網絡進行訓練,然後進行預測。我實際上是採用S形方法(不理想),所以不使用標準的softmax/relu方式(這對我不起作用)。代碼運行,但答案是錯誤的:批處理中的所有預測給出幾乎相同的答案,如y_true = [[0.356],[0.356],[0.356],[0.356]],對於輸入= [[0.1,0.2, 0.3,0.4]]。我究竟做錯了什麼?代碼如下:Tensorflow-使用神經網絡估計基本線性方程

import tensorflow as tf 
import numpy as np 

epochs = 1000 
# For equation y = b + 0.1, sample data below 
myImportedDatax_np = np.array([[.1],[.2],[.3],[.4]],dtype=float) 
myImportedDatay_np = np.array([[.2],[.3],[.4],[.5]],dtype=float) 

c = tf.constant(0.1, name='c') 
b = tf.placeholder(tf.float32, [None, 1], name='b') 
y = tf.add(b, c, name='y') 

y_true = tf.placeholder(tf.float32, [None, 1], name='y_true') 

W1 = tf.Variable(tf.random_normal([1, 3], stddev=0.03), name='W1') 
b1 = tf.Variable(tf.random_normal([3]), name='b1') 
W2 = tf.Variable(tf.random_normal([3, 1], stddev=0.03), name='W2') 
b2 = tf.Variable(tf.random_normal([1]), name='b2') 

hidden_out = tf.add(tf.matmul(b, W1), b1) 
hidden_out = tf.sigmoid(hidden_out) 

y_ = tf.sigmoid(tf.add(tf.matmul(hidden_out, W2), b2)) 

cost = tf.reduce_mean(tf.square(y_ - y_true)) 
optimiser = tf.train.GradientDescentOptimizer(0.005).minimize(cost) 

init_op = tf.initialize_all_variables() 

with tf.Session() as sess: 
    # initialise the variables 
    sess.run(init_op) 
    for epoch in range(epochs): 
     _, cost_now = sess.run([optimiser, cost], {b: myImportedDatax_np, y_true: myImportedDatay_np}) 
    print("Predicted values are:") 
    print(sess.run(y_, {b: myImportedDatax_np})) 

回答

2

有幾件事情是你的代碼錯誤:

  1. 你是一個迴歸問題,y = x + c,所以刪除乙狀結腸輸出:

    y_ = tf.add(tf.matmul(hidden_out, W2), b2) 
    
  2. 單個隱藏層可以更好地爲您服務,爲您這麼簡單的任務您的多個隱藏單元將需要它訓練更長的時間。

  3. 要處理2,增加你的時代到價值較高的說,萬和你的學習速度也較高,比如0.1

編輯: 添加代碼:

#increased the number of epoch 
epochs = 10000 
# For equation y = b + 0.1, sample data below 
myImportedDatax_np = np.array([[.1],[.2],[.3],[.4]],dtype=float) 
myImportedDatay_np = np.array([[.2],[.3],[.4],[.5]],dtype=float) 

c = tf.constant(0.1, name='c') 
b = tf.placeholder(tf.float32, [None, 1], name='b') 
y = tf.add(b, c, name='y') 

y_true = tf.placeholder(tf.float32, [None, 1], name='y_true') 

W1 = tf.Variable(tf.random_normal([1, 3], stddev=0.03), name='W1') 
b1 = tf.Variable(tf.random_normal([3]), name='b1') 
W2 = tf.Variable(tf.random_normal([3, 1], stddev=0.03), name='W2') 
b2 = tf.Variable(tf.random_normal([1]), name='b2') 

hidden_out = tf.add(tf.matmul(b, W1), b1) 
hidden_out = tf.sigmoid(hidden_out) 
# Removed the activation 
y_ = tf.add(tf.matmul(hidden_out, W2), b2) 

cost = tf.reduce_mean(tf.square(y_ - y_true) 

#changed the learning rate 
optimiser = tf.train.GradientDescentOptimizer(0.1).minimize(cost) 

init_op = tf.global_variables_initializer() 

#Predicted values are: 
#[[ 0.19917184] 
#[ 0.30153054] 
#[ 0.40164429] 
#[ 0.4976812 ]] 
+0

添加的代碼中答案 –

+0

太棒了,它的工作原理。如你所說,巨大的差異在於大量的時代以及學習速度的提高。如果我在sigmoid中添加輸出,結果可能相當不真實。 –