2017-03-15 135 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))