2017-03-15 137 views
1

我想用tensorflow預測二進制輸出。訓練數據大約有69%的輸出爲零。輸入特徵是實值,我通過減去平均值和除以標準偏差對它們進行歸一化。每次我運行網絡時,無論我嘗試過什麼技術,我都無法獲得精度高達69%的模型,而且看起來我的Yhat正在趨於全零。Tensorflow趨於平均值

我已經嘗試了很多像不同的優化器,損失函數,批量大小等等的東西。但不管我做什麼,它收斂到69%,永遠不會超過。我猜,我正在做的事情上有一個更有趣的問題,但我似乎無法找到它。

這裏是我的代碼

X = tf.placeholder(tf.float32,shape=[None,14],name='X') 
    Y = tf.placeholder(tf.float32,shape=[None,1],name='Y') 

    W1 = tf.Variable(tf.truncated_normal(shape=[14,20],stddev=0.5)) 
    b1 = tf.Variable(tf.zeros([20])) 
    l1 = tf.nn.relu(tf.matmul(X,W1) + b1) 

    l1 = tf.nn.dropout(l1,0.5) 

    W2 = tf.Variable(tf.truncated_normal(shape=[20,20],stddev=0.5)) 
    b2 = tf.Variable(tf.zeros([20])) 
    l2 = tf.nn.relu(tf.matmul(l1,W2) + b2) 

    l2 = tf.nn.dropout(l2,0.5) 

    W3 = tf.Variable(tf.truncated_normal(shape=[20,15],stddev=0.5)) 
    b3 = tf.Variable(tf.zeros([15])) 
    l3 = tf.nn.relu(tf.matmul(l2,W3) + b3) 

    l3 = tf.nn.dropout(l3,0.5) 

    W5 = tf.Variable(tf.truncated_normal(shape=[15,1],stddev=0.5)) 
    b5 = tf.Variable(tf.zeros([1])) 
    Yhat = tf.matmul(l3,W5) + b5 

    loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=Yhat, labels=Y)) 

    learning_rate = 0.005 
    l2_weight = 0.001 
    learner = tf.train.AdamOptimizer(learning_rate).minimize(loss) 

    correct_prediction = tf.equal(tf.greater(Y,0.5), tf.greater(Yhat,0.5)) 
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 

回答

0

您正在使用恆定壓差的最新版本。

l3 = tf.nn.dropout(l3,0.5) 

退出只能在訓練時使用,而不能在檢查準確性或預測期間使用。

keep_prob = tf.placeholder(tf.float32) 
l3 = tf.nn.dropout(l3,keep_prob) 

佔位符應在培訓期間給予適當的價值,並在測試/預測時給予1。

你在每一層都有輟學,我不確定你是否需要爲一個小型網絡做很多輟學。希望這有助於

+0

感謝您的建議。它沒有解決問題,但我確信一旦我超過這個問題,它會有所幫助。 – Iinferno1

0

當你計算你correct_prediction

correct_prediction = tf.equal(tf.greater(Y,0.5), tf.greater(Yhat,0.5)) 

看來Yhat仍然logits,你應該計算Y_pred使用乙狀結腸,並使用Y_pred來計算你的correct_prediction

Y_pred = tf.nn.sigmoid(Yhat) 
    correct_prediction = tf.equal(tf.greater(Y,0.5), tf.greater(Y_pred,0.5))