python - Tensorflow - softmax 仅返回 0 和 1
问题描述
我正在用 TensorFlow 训练 CNN,但我的损失没有改善;我注意到它tf.nn.softmax()
返回了一个只有 0 和 1 的张量,而不是我期望的分布。这是 repo,我相信这是我无法训练网络的原因,但我不知道如何解决它。
解决方案
查看神经网络下的第二个框:
# 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
并有效地计算交叉熵。
推荐阅读
- mysql - django field datetime set auto_now_add = true 但是mysql错误字段没有默认值
- android - 在 org.gradle.api.internal.artifacts.dsl.dependencies 类型的对象上找不到参数 [directory 'libs'] 的方法 implementation()
- pyspark - 根据条件从 spark 数据框中删除行
- woocommerce - 删除 WooCommerce 结帐时的“已添加到购物车”和“购物车已更新”消息
- swift - 为什么 `nil` 隐式展开可选打印 `nil` 而不会崩溃?
- node.js - 如何在 AWS Lambda 中将 ICU 数据添加到 Node.js?
- bash - 将陷阱添加到在 Travis CI 中运行的测试脚本
- docker - 批处理脚本将所有行作为一个调用执行
- java - 如何使用 Spring Boot 和 Angular 7 配置 CRSF
- java - 有没有办法在构建片段后调用方法?