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