【问题标题】:Tensorflow converge to meanTensorflow 收敛到均值
【发布时间】:2017-03-15 21:34:49
【问题描述】:

我正在尝试使用 tensorflow 预测二进制输出。训练数据有大约 69% 的输出为零。输入特征是实数值的,我通过减去均值并除以标准差来对它们进行归一化。每次我运行网络时,无论我尝试了何种技术,我都无法获得 >69% 的准确率,而且看起来我的 Yhat 正在收敛到全零。

我尝试了很多东西,比如不同的优化器、损失函数、批量大小等。但无论我做什么,它都会收敛到 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))

【问题讨论】:

    标签: tensorflow feed-forward


    【解决方案1】:

    当你计算你的correct_prediction

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

    似乎Yhat 仍然是logits,您应该使用sigmoid 计算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))
    

    【讨论】:

      【解决方案2】:

      您正在使用恒定的 dropout。

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

      只应在训练时使用 Dropout,而不应在检查准确性或预测期间使用。

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

      应在训练期间为占位符指定适当的值,在测试/预测时为 1 指定。

      每一层都有 dropout,我不确定小型网络是否需要那么多 dropout。希望这会有所帮助

      【讨论】:

      • 感谢您的建议。它没有解决问题,但我相信一旦我克服了这个问题,它会有所帮助。
      猜你喜欢
      • 2018-01-19
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-24
      • 2016-10-05
      • 1970-01-01
      相关资源
      最近更新 更多