我创建了一个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。