Pytorch 二元稀疏性损失

Pytorch 二元稀疏性损失,pytorch,loss-function,Pytorch,Loss Function,我的网络输出有二进制图像(如下所示)。我需要'1'彼此距离更远(未连接),以便它们形成稀疏的二值图像(没有白色斑点)。有点像盐和胡椒的噪音。我正在寻找一种定义损失的方法(在pytorch中),它将根据“1”的密度进行惩罚 谢谢 I这取决于您如何生成所述图像。由于神经网络必须通过反向传播进行训练,我相当肯定你的二值图像不是你的神经网络的直接输出(即不是你正在应用损失的东西),因为梯度不能穿透二值(离散)变量。我怀疑你做了一些像像素或类似的事情,然后是阈值 我假设您的代码是这样工作的:您密集地回归实

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

谢谢


I

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

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

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

squashed = torch.sigmoid(nn_output)
然后用
内核
卷积
压缩
,这将提供非零邻居的松弛数量

neighborhood = nn.functional.conv2d(squashed, kernel, padding=2)
而您的损失将是
压缩中每个像素的值与
邻域中相应值的乘积:

sparsity_loss = (squashed * neighborhood).mean()
如果您将此损失应用于二进制图像,则对于给定像素
p
,当且仅当
p
及其至少一个相邻像素的值为1和0时,它将为1。由于我们将其应用于
[0,1]
范围内的非二进制数,因此它将是该范围的可微近似

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

sparsity_loss = (squashed * neighborhood).mean()