gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:40:57 25 4
gpt4 key购买 nike

我创建了一个 TensorFlow 神经网络,它有 2 个隐藏层,每个隐藏层有 10 个单元,使用 ReLU 激活和 Xavier 初始化作为权重。输出层有 1 个单元输出二元分类(0 或 1),使用 sigmoid 激活函数根据输入特征对是否相信泰坦尼克号上的乘客幸存进行分类。

(唯一省略的代码是 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())

转发 Prop

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)

session

# 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

Returns the index with the largest value across axes of a tensor.

如果不传入axis,则该轴设置为0。由于轴0只有一个值,所以返回的索引始终为0。

关于python-3.x - TensorFlow:神经网络在训练和测试集上的准确率始终为 100%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46187801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com