Deep learning 如何将logits作为神经网络输出
简单而简短的问题。我有一个执行图像分割的网络(Unet)。我想把logit作为输出输入交叉熵损失(使用pytorch)。目前,我的最后一层看起来是这样的:Deep learning 如何将logits作为神经网络输出,deep-learning,pytorch,conv-neural-network,Deep Learning,Pytorch,Conv Neural Network,简单而简短的问题。我有一个执行图像分割的网络(Unet)。我想把logit作为输出输入交叉熵损失(使用pytorch)。目前,我的最后一层看起来是这样的: class Logits(nn.Sequential): def __init__(self, in_channels, n_class ): super(Logits, self).__init__()
class Logits(nn.Sequential):
def __init__(self,
in_channels,
n_class
):
super(Logits, self).__init__()
# fully connected layer outputting the prediction layers for each of my classes
self.conv = self.add_module('conv_out',
nn.Conv2d(in_channels,
n_class,
kernel_size = 1
)
)
self.activ = self.add_module('sigmoid_out',
nn.Sigmoid()
)
这里使用sigmoid激活功能正确吗?这给了我logits吗?当人们谈论“logits”时,他们通常指的是“原始”n\u类
维输出向量。对于多类分类(n\u类
>2),您希望将原始“logits”的n\u类
-维向量转换为n\u类
-维概率向量。也就是说,对于所有
n\u类
条目,您希望prob=f(logits)
具有prob\u i>=0
,并且sum(prob)=1
以可微的方式实现这一点最直接的方法是使用函数:
prob_i = softmax(logits) = exp(logits_i) / sum_j exp(logits_j)
很容易看出,softmax
的输出实际上是一个n_类
-弱概率向量(我把它留给您作为一个简短的练习)
顺便说一句,这就是为什么原始预测被称为“logit”,因为它们是输出预测概率的“log”
现在,通常不在分类网络上显式计算softmax,并将其计算推迟到损失函数,例如,内部计算softmax并要求原始logit作为输入,而不是归一化概率。这主要是为了数值稳定性
因此,如果您正在使用nn.CrossEntropyLoss
培训一个多类别分类网络,您根本不需要担心最终激活,只需从最终conv/linear层输出原始登录即可。最重要的是,不要使用
nn.Sigmoid()
激活,因为它倾向于具有饱和梯度,并且会扰乱你的训练。当人们谈论“登录”时,他们通常指的是“原始”n_类
维输出向量。对于多类分类(n\u类
>2),您希望将原始“logits”的n\u类
-维向量转换为n\u类
-维概率向量。也就是说,对于所有
n\u类
条目,您希望prob=f(logits)
具有prob\u i>=0
,并且sum(prob)=1
以可微的方式实现这一点最直接的方法是使用函数:
prob_i = softmax(logits) = exp(logits_i) / sum_j exp(logits_j)
很容易看出,softmax
的输出实际上是一个n_类
-弱概率向量(我把它留给您作为一个简短的练习)
顺便说一句,这就是为什么原始预测被称为“logit”,因为它们是输出预测概率的“log”
现在,通常不在分类网络上显式计算softmax,并将其计算推迟到损失函数,例如,内部计算softmax并要求原始logit作为输入,而不是归一化概率。这主要是为了数值稳定性
因此,如果您正在使用nn.CrossEntropyLoss
培训一个多类别分类网络,您根本不需要担心最终激活,只需从最终conv/linear层输出原始登录即可。最重要的是,不要使用
nn.Sigmoid()
激活,因为它的梯度趋于饱和,会扰乱你的训练。据我所知,你正在进行一项多标签分类任务,其中一个输入可以有多个标签,因此你可以使用nn.Sigmoid
(vsnn.Softmax
用于多类别分类)
这里有一个损失函数,它结合了
nn.Sigmoid
和nn.BCELoss
:。因此,您将有一个长度为类数的logits向量作为输入。而且,目标也将具有相同的形状:作为多个热编码,活动类使用1
s。据我所知,您正在进行n多标签分类任务,其中单个输入可以有多个标签,因此您可以使用nn.Sigmoid
(vsnn.Softmax
进行多类别分类)
这里有一个损失函数,它结合了
nn.Sigmoid
和nn.BCELoss
:。因此,您将有一个长度为类数的logits向量作为输入。而且,目标也将具有相同的形状:作为一个多热编码,对于活动类,1
s。我不认为OP意味着多标签任务。我不认为OP意味着多标签任务。我想我真正想知道的是什么是“原始”逻辑。因为我确实很好奇我应该向nn.CrossEntropyLoss
函数提供什么类型的输出。因此,如果我理解正确,如果我计划使用nn.CrossEntropyLoss
,那么我应该删除self.activ我想我真正想知道的是什么是“原始”逻辑。因为我确实很好奇我应该向nn.CrossEntropyLoss
函数提供什么类型的输出。如果我理解正确,如果我计划使用nn.CrossEntropyLoss
然后我应该从我的上面的类中删除self.activ
,只需将self.conv
层的输出馈送到loss函数?@SteveAhlswede。确切地说,你是在做多类分类还是多标签分类?多类。我有一个背景类和一个n对象类和图像的每个像素都应该标记为两个类中的一个。我现在意识到,使用sigmoid作为激活函数可能是不明智的选择。因此输入图像可以有多个类,对吗?@SteveAhlswede,因为每个像素只能是两个类中的一个。这是二进制类