【发布时间】:2018-02-21 14:09:53
【问题描述】:
我创建了一个 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())
转发道具
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(ground truth 标签)时也会发生同样的事情,这很奇怪,因为 Y 包含训练示例的所有正确标签。
非常感谢任何帮助。谢谢。
【问题讨论】:
-
我不明白“看起来我来自 Y_hat 的所有数据都是 1 或接近 1,我训练模型的时间越长,我在 Y_hat 和 Y 上的所有 argmax 值(其中有0 或 1) 的基本事实标签显示为 0。”这句话非常令人困惑。你能改写一下吗?
-
刚刚进行了编辑。这样更好吗?
标签: python-3.x machine-learning tensorflow neural-network