我试图使用Tensorflow尝试泰坦尼克号的比赛。
我预处理的列车数据如下所示:
data_x:
PassengerId Pclass Sex Age SibSp Parch Ticket Fare Cabin \ Embarked
1 2 1 1 38.0 1 0 500 71.2833 104
2 3 3 1 26.0 0 0 334 7.9250 0
3 4 1 1 35.0 1 0 650 53.1000 130
4 5 3 0 35.0 0 0 638 8.0500 0
data_y:
Survived
0
1
1
1
0
softmax功能应该用来预测乘客是否幸存,因为它是二进制的,对吗?
以下是我建立模型的方法:
X = tf.placeholder(tf.float32, [None, data_x.shape[1]])
Y_ = tf.placeholder(tf.float32, [None, 1])
W = tf.Variable(tf.truncated_normal([10, 1]))
b = tf.Variable(tf.zeros([1]))
# Parameters
learning_rate = 0.001
#The model
Y = tf.matmul(X,W) + b
# Loss function
entropy = tf.nn.softmax_cross_entropy_with_logits(labels=Y_, logits=Y)
loss = tf.reduce_mean(entropy) # computes the mean over examples in the batch
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
acc = tf.equal(tf.argmax(Y_, 1), tf.argmax(Y, 1))
acc = tf.reduce_mean(tf.cast(acc, tf.float32))
tf.summary.scalar('loss', loss)
tf.summary.scalar('accuracy', acc)
merged_summary = tf.summary.merge_all()
init = tf.global_variables_initializer()
最后,培训部分:
with tf.Session() as sess:
sess.run(init)
writer = tf.summary.FileWriter("./graphs", sess.graph)
for i in range(1000):
_, l, summary = sess.run([optimizer, loss, merged_summary], feed_dict={X: data_x, Y_: data_y})
writer.add_summary(summary, i)
if i%100 == 0:
print (i)
print ("loss = ", l)
但是从第一步开始,损失就等于0 ......
这是Tensorboard可视化:
知道这里发生了什么吗?
答案 0 :(得分:2)
实际上,我认为你对softmax的想法是错误的。 它转换输出,使得它们是概率分布。 但是,由于您的输出只有一个神经元,因此softmax始终将其转换为1。
如果你想要softmax +交叉熵与logits,你需要输出2个神经元,一个用于预测概率为1(正),一个用于概率为0(负)。您还需要更改标签,以便正面示例标记为[1, 0]
,标记为[0, 1]
。然后,你可以使用交叉熵,它应该工作。
编辑:另一个好的选择可能是使用
tf.nn.sigmoid_cross_entropy_with_logits
损失函数。 Sigmoid转换到交叉熵所需的[0, 1]
区间,并且不担心(可能的)其他输出。这样,它将适用于您当前的标签和架构。
答案 1 :(得分:0)
使用
entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=Y_, logits=Y)
代替
entropy = tf.nn.softmax_cross_entropy_with_logits(labels=Y_, logits=Y)