【发布时间】:2020-04-28 20:07:10
【问题描述】:
我的网络输出端有二进制图像(如下图)。我需要'1'彼此远离(未连接),以便它们形成稀疏的二进制图像(没有白色斑点)。有点像椒盐噪声。我正在寻找一种方法来定义损失(在 pytorch 中),它会根据 '1's 的密度进行惩罚。
谢谢。
【问题讨论】:
标签: pytorch loss-function
我的网络输出端有二进制图像(如下图)。我需要'1'彼此远离(未连接),以便它们形成稀疏的二进制图像(没有白色斑点)。有点像椒盐噪声。我正在寻找一种方法来定义损失(在 pytorch 中),它会根据 '1's 的密度进行惩罚。
谢谢。
【问题讨论】:
标签: pytorch loss-function
这取决于您如何生成所述图像。由于必须通过反向传播训练神经网络,我很确定您的二进制图像不是您的神经网络的直接输出(即不是您应用损失的东西),因为梯度不能通过二进制(离散) 变量。我怀疑你做了类似像素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)。
【讨论】: