TensorFlow:在训练和测试集上神经网络的准确度始终为100%

我创建了一个TensorFlow神经网络,它具有两个隐藏层,每个层包含10个单元,每个单元使用权重的ReLU激活和Xavier初始化。 输出层具有1个输出二进制分类(0或1)的单元,使用S形激活函数来分类它是否相信基于输入特征存在的泰坦尼克号上的乘客。

(唯一省略的代码是load_data函数,该函数填充稍后在程序中使用的变量X_train,Y_train,X_test,Y_test)

参数

# Hyperparams 
learning_rate = 0.001
lay_dims = [10,10, 1]

# Other params
m = X_train.shape[1] 
n_x = X_train.shape[0]
n_y = Y_train.shape[0]

输入

X = tf.placeholder(tf.float32, shape=[X_train.shape[0], None], name="X")
norm = tf.nn.l2_normalize(X, 0) # normalize inputs

Y = tf.placeholder(tf.float32, shape=[Y_train.shape[0], None], name="Y")

初始化重量和偏差

W1 = tf.get_variable("W1", [lay_dims[0],n_x], initializer=tf.contrib.layers.xavier_initializer())
b1 = tf.get_variable("b1", [lay_dims[0],1], initializer=tf.zeros_initializer())

W2 = tf.get_variable("W2", [lay_dims[1],lay_dims[0]], initializer=tf.contrib.layers.xavier_initializer())
b2 = tf.get_variable("b2", [lay_dims[1],1], initializer=tf.zeros_initializer())

W3 = tf.get_variable("W3", [lay_dims[2],lay_dims[1]], initializer=tf.contrib.layers.xavier_initializer())
b3 = tf.get_variable("b3", [lay_dims[2],1], initializer=tf.zeros_initializer())

前进道具

Z1 = tf.add(tf.matmul(W1,X), b1)
A1 = tf.nn.relu(Z1)

Z2 = tf.add(tf.matmul(W2,A1), b2)
A2 = tf.nn.relu(Z2)

Y_hat = tf.add(tf.matmul(W3,A2), b3)

BackProp

cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=tf.transpose(Y_hat), labels=tf.transpose(Y)))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)

会议

# Initialize
init = tf.global_variables_initializer()

with tf.Session() as sess:
    # Initialize
    sess.run(init)

    # Normalize Inputs
    sess.run(norm, feed_dict={X:X_train, Y:Y_train})

    # Forward/Backprob and update weights
    for i in range(10000):
        c, _ = sess.run([cost, optimizer], feed_dict={X:X_train, Y:Y_train})
        if i % 100 == 0:
            print(c)

    correct_prediction = tf.equal(tf.argmax(Y_hat), tf.argmax(Y))

    accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

    print("Training Set:", sess.run(accuracy, feed_dict={X: X_train, Y: Y_train}))
    print("Testing Set:", sess.run(accuracy, feed_dict={X: X_test, Y: Y_test}))

在运行10,000次训练之后,成本每次都下降,因此它表明learning_rate没问题,并且成本函数看起来正常。 然而,在训练之后,我所有的Y_hat值(对训练集的预测)都是1(预测乘客幸存下来)。 所以基本上,对于每个训练示例,预测只输出y = 1。

另外,当我在Y_hat上运行tf.argmax时,结果是全0的矩阵。 当tf.argmax应用于Y(地面实况标签)时,同样的事情发生了,这是奇怪的,因为Y由训练样例的所有正确标签组成。

任何帮助是极大的赞赏。 谢谢。


我假设你的Y_hat是一个(1,m)矩阵,其中m是训练样例数。 然后tf.argmax(Y_hat)将给出所有0.根据tensorflow文档,argmax

返回张量中跨越轴的最大值的索引

如果您没有通过轴,轴被设置为0.因为轴0只有一个值,所以返回的索引始终变为0。


我知道我迟到了,但我也会指出,因为你的标签矩阵是有形的(n,1),也就是说,只有一个类可以预测,因此交叉熵没有意义。 在这种情况下,您应该使用不同的东西来计算成本(可能是均方误差或类似的东西)。 最近我在开展大学项目时遇到了类似的问题,并且我发现了一个解决方法,我将这个二进制输出转换为2个类,例如存在和不存在,所以如果存在的话它是[1,0]。 我知道这不是最好的办法,但是当你需要即时的工作时,这可能会有帮助。

链接地址: http://www.djcxy.com/p/5511.html

上一篇: TensorFlow: Neural Network accuracy always 100% on train and test sets

下一篇: dict issue