【问题标题】:Loss for binary sparsity二元稀疏的损失
【发布时间】:2020-04-28 20:07:10
【问题描述】:

我的网络输出端有二进制图像(如下图)。我需要'1'彼此远离(未连接),以便它们形成稀疏的二进制图像(没有白色斑点)。有点像椒盐噪声。我正在寻找一种方法来定义损失(在 pytorch 中),它会根据 '1's 的密度进行惩罚。

谢谢。

我

【问题讨论】:

    标签: pytorch loss-function


    【解决方案1】:

    这取决于您如何生成所述图像。由于必须通过反向传播训练神经网络,我很确定您的二进制图像不是您的神经网络的直接输出(即不是您应用损失的东西),因为梯度不能通过二进制(离散) 变量。我怀疑你做了类似像素binary cross entropy 或类似的事情,然后是阈值。

    我假设你的代码是这样工作的:你密集地回归实数值然后应用阈值,可能使用sigmoid从[-inf, inf]映射到[0, 1]。如果是这样,您可以执行以下操作。构建一个卷积核,中心为0,其他位置为1,其大小与您希望“稀疏间隙”的大小有关。

    kernel = [
        [1, 1, 1, 1, 1]
        [1, 1, 1, 1, 1]
        [1, 1, 0, 1, 1]
        [1, 1, 1, 1, 1]
        [1, 1, 1, 1, 1]
    ]
    

    然后您将sigmoid 应用于您的实值输出以将其压缩为[0, 1]:

    squashed = torch.sigmoid(nn_output)
    

    然后将squashed 与kernel 进行卷积,得到非零邻居的宽松数量。

    neighborhood = nn.functional.conv2d(squashed, kernel, padding=2)
    

    您的损失将是squashed 中每个像素的值与neighborhood 中相应值的乘积:

    sparsity_loss = (squashed * neighborhood).mean()
    

    如果您考虑将这种损失应用于您的二值图像,对于给定像素p,当且仅当p 及其至少一个相邻像素的值都为 1 时,它才会为 1,否则为 0。由于我们将其应用于[0, 1] 范围内的非二进制数,因此它将是它的可微近似。

    请注意,我在上面的代码中遗漏了一些细节(例如正确地重塑 kernel 以使用 nn.functional.conv2d)。

    【讨论】:

      猜你喜欢
      • 2020-10-12
      • 2016-07-12
      • 1970-01-01
      • 2020-12-22
      • 2017-12-26
      • 2020-08-31
      • 2012-06-20
      • 2017-11-23
      • 2015-10-31
      相关资源
      最近更新 更多