Tensorflow 收敛于均值
Tensorflow converge to mean
我正在尝试使用 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))
您正在使用常量漏失。
l3 = tf.nn.dropout(l3,0.5)
Dropout 只应在训练时使用,而不应在检查准确性或预测期间使用。
keep_prob = tf.placeholder(tf.float32)
l3 = tf.nn.dropout(l3,keep_prob)
占位符在训练时应给予适当的值,而testing/prediction则为1。
你在每一层都有 dropouts,我不确定你是否需要一个小网络那么多的 dropouts。希望这有帮助
当你计算你的 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))
我正在尝试使用 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))
您正在使用常量漏失。
l3 = tf.nn.dropout(l3,0.5)
Dropout 只应在训练时使用,而不应在检查准确性或预测期间使用。
keep_prob = tf.placeholder(tf.float32)
l3 = tf.nn.dropout(l3,keep_prob)
占位符在训练时应给予适当的值,而testing/prediction则为1。
你在每一层都有 dropouts,我不确定你是否需要一个小网络那么多的 dropouts。希望这有帮助
当你计算你的 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))