【问题标题】:Map the output values of a network in 0 or 1 TensorFlow在 0 或 1 个 TensorFlow 中映射网络的输出值
【发布时间】:2019-03-07 00:33:33
【问题描述】:

我有一个输出层大小为[3, 13000, 3, 1] (B,H,W,C) 的网络,我使用tf.reduce_mean 对其进行了转换以获得输出大小[3, 13000, 1]

图形上是这个

对吗?

我的标签大小为 [3, 13000, 1] 作为我的新输出,并且都是 0 或 1 值。

现在我必须用标签计算损失。为了计算这个损失,我使用这个公式 tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=predict, labels=y)),但首先我必须将输出中的所有值转换为 0 或 1。我使用的是 tf.nn.softmax 函数,但我得到的都是 1。

如何实现将阈值以下的所有值映射到 0 和 1 以上的函数?这个阈值应该是例如(max value - min value) / 2。这也应该适用于反向传播步骤中的梯度。

【问题讨论】:

  • 输出是用relu函数获得的,所以它的值为[0, x],但我需要[0, 1]

标签: python python-2.7 tensorflow loss-function softmax


【解决方案1】:

由于您的预测是单个类值,因此当您对其应用 softmax 时,无论值如何,它都将始终为 1:(exp(predict)/sum(exp(predict)) = exp(predict)/exp(predict) = 1)。要么将输入转换为one-hot,让模型预测两个类别:[0, 1],要么改用sigmoid cross entropy

【讨论】:

  • 可能我解释的不是很好。我的输出是 [3, 13000, 1] 的随机值,因为我删除了 relu 并且它们来自多个 conv 层。目标具有相同的形状,内部我的值为 0 或 1,但不是一个热向量。我要做的是将输出的第一个元素与目标的第一个元素匹配,并检查它们是否相等并对所有元素执行此操作。
  • 对于这些 3x1300 输出中的每一个,您的输出 class labels 仍然为 1(因此您将获得所有 3x1300 为 1)。如果要保持相同的尺寸,则需要使用 sigmoid。对于softmax,您的模型 logits 应输出 [3, 13000,2] 以预测 2 个类别 0 或 1,因为该标签需要进行 one-hot 编码。
  • 好的,我明白 softmax 想要什么,但我需要保留这些尺寸,所以我从现在开始不会使用它。我正在寻找的是一个内置函数或将我的输出值变为 0 或 1 的东西。示例 [-3.412, 1.5, 7.521] -> [0, 0, 1]。然后为了计算损失,我找到了一种使用其他函数而不是 softmax_cross_entropy 的方法。
  • 使用 sigmoid,你的 nn 会通过学习来调整阈值,输出在 0 到 1 之间。
  • 我在发布到 Stack 之前尝试使用它,但它给出的值是 0.5-1 而不是 0-1,但现在可以使用。这很奇怪。谢谢
猜你喜欢
  • 2020-01-26
  • 1970-01-01
  • 2020-03-08
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 2012-09-12
相关资源
最近更新 更多