TensorFlow:在列车和测试装置上,神经网络精度始终为100%

时间:2017-09-13 02:14:49

标签: python-3.x machine-learning tensorflow neural-network

我创建了一个TensorFlow神经网络,它有2个隐藏层,每个隐藏层有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由训练样例的所有正确标签组成。

非常感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:3)

我假设您的Y_hat是(1,m)矩阵,其中m是训练示例的数量。然后tf.argmax(Y_hat)将给出全部0.根据tensorflow文档,argmax

  

返回张量轴上最大值的索引

如果未传入轴,则轴设置为0.因为轴0只有一个值,所以返回的索引始终为0。

答案 1 :(得分:0)

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