【问题标题】:Loss is equal to 0 from the beginning损失从一开始就等于0
【发布时间】:2018-01-27 05:18:45
【问题描述】:

我正在尝试使用 Tensorflow 参加 Titanic Kaggle 比赛。

我预处理的火车数据如下所示:

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)

但是从第一步开始loss就等于0了……

这是 Tensorboard 可视化:

知道这里发生了什么吗?

【问题讨论】:

    标签: python tensorflow deep-learning tensorboard


    【解决方案1】:

    实际上,我认为您对 softmax 的理解是错误的。 它将输出转换为概率分布。 但是,由于您的输出只有一个神经元,softmax 总是将其转换为 1。

    如果你想要 softmax + 带 logits 的交叉熵,你需要输出 2 个神经元,一个用于预测概率为 1(正),一个用于预测概率为 0(负)。您还需要更改标签,例如正例的标签为[1, 0],负例为[0, 1]。然后,您可以使用交叉熵,它应该可以工作。

    编辑:另一个不错的选择可能是使用 tf.nn.sigmoid_cross_entropy_with_logits 损失函数。 Sigmoid 将转换为交叉熵所需的[0, 1] 区间,并且不担心(可能的)其他输出。这样,它就可以与您当前的标签和架构一起使用。

    【讨论】:

    • 当然!我忘了...它必须是一个热编码。我会试一试,让你知道:)
    【解决方案2】:

    使用

    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)
    

    【讨论】:

    猜你喜欢
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多