首页 > 解决方案 > Tensorflow - softmax 仅返回 0 和 1

问题描述

我正在用 TensorFlow 训练 CNN,但我的损失没有改善;我注意到它tf.nn.softmax()返回了一个只有 0 和 1 的张量,而不是我期望的分布。这是 repo,我相信这是我无法训练网络的原因,但我不知道如何解决它。

标签: pythontensorflowneural-networksoftmaxcross-entropy

解决方案


查看神经网络下的第二个框:

# output layer
with tf.variable_scope('output_lay') as scope:
    weights = weight_variable([4096, CLASSES])
    bias = bias_variable([CLASSES], 0.)
    activation = tf.nn.relu(tf.matmul(out, weights)+bias, name=scope.name)
    out = tf.nn.softmax(activation)
return tf.reshape(out, [-1, CLASSES])

注意:ReLu激活仅用于隐藏层而不是输出层。

train然后你把它喂给你的函数中的交叉熵

logits=AlexNet(x_tr)

# loss function
cross_entropy = -tf.reduce_sum(tf.squeeze(y_tr)*tf.log(tf.clip_by_value(tf.squeeze(logits),1e-10,1.0)))
loss = tf.reduce_mean(cross_entropy)

重新访问交叉熵

C= −1/n * (∑[y*ln(a)+(1−y)*ln(1−a)])

在哪里a = sigmoid(W(x)+b),所以我建议:

with tf.variable_scope('output_lay') as scope:
    weights = weight_variable([4096, CLASSES])
    bias = bias_variable([CLASSES], 0.)
    return tf.matmul(out, weights)+bias

为简单起见,只需使用内置的 softmax 函数:

logits=AlexNet(x_tr)

cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=ground_truth_input, logits=logits)
loss = tf.reduce_mean(cross_entropy)

tf.nn.softmax_cross_entropy_with_logits接受W(x)+b并有效地计算交叉熵。


推荐阅读