2

所以,我試圖學習tensorflow,爲此,我嘗試創建一個分類器,我認爲它並不那麼難。 我想預測一個數字是奇數還是偶數。 問題是,Tensorflow總是預測相同的輸出,我搜索答案的最後幾天,但沒有任何幫助我...... 我看到了如下回答: - Tensorflow predicts always the same resultTensorflow總是預測相同的輸出

- TensorFlow always converging to same output for all items after training

- TensorFlow always return same result

這裏是我的代碼:

在:

df 
    nb y1 
0 1 0 
1 2 1 
2 3 0 
3 4 1 
4 5 0 
... 
19 20 1 

inputX = df.loc[:, ['nb']].as_matrix() 
inputY = df.loc[:, ['y1']].as_matrix() 
print(inputX.shape) 
print(inputY.shape) 

出:

(20,1) (20,1)

在:

# Parameters 
learning_rate = 0.00000001 
training_epochs = 2000 
display_step = 50 
n_samples = inputY.size 


x = tf.placeholder(tf.float32, [None, 1]) 
W = tf.Variable(tf.zeros([1, 1]))   
b = tf.Variable(tf.zeros([1]))    
y_values = tf.add(tf.matmul(x, W), b)  
y = tf.nn.relu(y_values)     
y_ = tf.placeholder(tf.float32, [None,1]) 

# Cost function: Mean squared error 
cost = tf.reduce_sum(tf.pow(y_ - y, 2))/(2*n_samples) 
# Gradient descent 
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) 

# Initialize variabls and tensorflow session 
init = tf.global_variables_initializer() 
sess = tf.Session() 
sess.run(init) 

for i in range(training_epochs): 
    sess.run(optimizer, feed_dict={x: inputX, y_: inputY}) # Take a gradient descent step using our inputs and labels 

    # Display logs per epoch step 
    if (i) % display_step == 0: 
     cc = sess.run(cost, feed_dict={x: inputX, y_:inputY}) 
     print("Training step:", '%04d' % (i), "cost=", "{:.9f}".format(cc)) #, \"W=", sess.run(W), "b=", sess.run(b) 

print ("Optimization Finished!") 
training_cost = sess.run(cost, feed_dict={x: inputX, y_: inputY}) 
print ("Training cost=", training_cost, "W=", sess.run(W), "b=", sess.run(b), '\n') 

出:

Training step: 0000 cost= 0.250000000 
Training step: 0050 cost= 0.250000000 
Training step: 0100 cost= 0.250000000 
... 
Training step: 1800 cost= 0.250000000 
Training step: 1850 cost= 0.250000000 
Training step: 1900 cost= 0.250000000 
Training step: 1950 cost= 0.250000000 
Optimization Finished! 
Training cost= 0.25 W= [[ 0.]] b= [ 0.] 

在:

sess.run(y, feed_dict={x: inputX }) 

出:

array([[ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.], 
     [ 0.]], dtype=float32) 

我試圖玩我的超參數,如學習率或訓練時期的數量。 我將激活功能從softmax更改爲relu。 我改變了我的數據框以獲得更多示例,但沒有發生任何事情。 我也嘗試爲我的權重添加隨機數,但沒有任何變化,成本剛剛開始增加。

回答

3

從快速瀏覽代碼看,它對我來說看起來還可以(也許是將權重初始化爲零,通常你想要一個不同於零的小數以避免一個小問題),而我不認爲你可以用線性迴歸來擬合整數奇偶性的問題。

的一點是,你正在試圖將

x % 2 

與形式

activation(x * w + b) 

的預測,並沒有辦法找到好的wb來解決這個問題。

理解這一點的另一種方法是繪製您的數據:x奇偶校驗的散點圖是兩條直線,並且用直線擬合它們的唯一方法是用一條扁平線(這將具有較高的無論如何成本)。

我認爲最好先改變數據,但如果你想解決這個問題,你應該使用正弦或餘弦作爲激活函數來獲得一些結果。

+0

坦克!我會嘗試與其他數據,並隨機起始重量。 –

3

我看到的主要問題是您用W來初始化W矩陣中的權重。你在線性層中的操作基本上是Wx + b。因此,相對於x的梯度是W.如果現在從W開始爲零,那麼梯度也爲0,並且您無法學習任何東西。嘗試使用tensorflow.org上所述的隨機初始值

# Create two variables. 
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35), 
         name="weights") 
biases = tf.Variable(tf.zeros([200]), name="biases") 
2

首先我必須承認我從來沒有使用過tensorflow。但我認爲你在這裏有一個建模問題。

您正在使用最簡單的網絡架構(1維perceptron)。你有兩個變量(W和B)要學習和輸出你的決策規則如下

decision formula of the pereceptron

如果你減去由W你

rearraged decision rule

b和鴻溝

所以你基本上是在尋找一個分開奇數和偶數的門檻。無論你如何選擇w和b,你總會錯誤分類一半數字。

雖然decinding如果一個數字是奇數,甚至似乎是一個超級平凡的任務,我們人類它不是一個單一的感知器。

相關問題