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

我创建了一个TensorFlow神经网络,它有两个隐藏层,每层有10个单元,使用ReLU激活函数和Xavier初始化权重。输出层有一个单元,用于输出二分类结果(0或1),使用sigmoid激活函数来判断泰坦尼克号乘客是否幸存,基于输入特征进行分类。

(唯一省略的代码是load_data函数,它填充了程序后面使用的变量X_train, Y_train, X_test, Y_test)

参数

# 超参数learning_rate = 0.001lay_dims = [10,10, 1]# 其他参数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) # 归一化输入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)

反向传播

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)

会话

# 初始化init = tf.global_variables_initializer()with tf.Session() as sess:    # 初始化    sess.run(init)    # 归一化输入    sess.run(norm, feed_dict={X:X_train, Y:Y_train})    # 前向/反向传播并更新权重    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("训练集:", sess.run(accuracy, feed_dict={X: X_train, Y: Y_train}))    print("测试集:", sess.run(accuracy, feed_dict={X: X_test, Y: Y_test}))

经过10,000次训练迭代后,每次成本都在下降,这表明学习率是合适的,成本函数看起来正常。然而,训练后,我所有的Y_hat值(训练集上的预测)都是1(预测乘客幸存)。因此,预测总是输出y=1,对于每个训练样本都是如此。

此外,当我对Y_hat运行tf.argmax时,结果是一个全是0的矩阵。同样的事情也发生在对Y(真实标签)应用tf.argmax时,这很奇怪,因为Y包含了所有训练样本的正确标签。

任何帮助都将不胜感激。谢谢。


回答:

我假设你的Y_hat是一个(1,m)矩阵,其中m是训练样本的数量。那么tf.argmax(Y_hat)会给出全是0的结果。根据TensorFlow文档,argmax

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

如果你不传入轴参数,轴会被设置为0。因为轴0只有一个值,返回的索引总是0。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注