Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Deep learning 如何将logits作为神经网络输出_Deep Learning_Pytorch_Conv Neural Network - Fatal编程技术网

Deep learning 如何将logits作为神经网络输出

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__()

简单而简短的问题。我有一个执行图像分割的网络(Unet)。我想把logit作为输出输入交叉熵损失(使用pytorch)。目前,我的最后一层看起来是这样的:

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
(vs
nn.Softmax
用于多类别分类)


这里有一个损失函数,它结合了
nn.Sigmoid
nn.BCELoss
:。因此,您将有一个长度为类数的logits向量作为输入。而且,目标也将具有相同的形状:作为多个热编码,活动类使用
1
s。

据我所知,您正在进行n多标签分类任务,其中单个输入可以有多个标签,因此您可以使用
nn.Sigmoid
(vs
nn.Softmax
进行多类别分类)


这里有一个损失函数,它结合了
nn.Sigmoid
nn.BCELoss
:。因此,您将有一个长度为类数的logits向量作为输入。而且,目标也将具有相同的形状:作为一个多热编码,对于活动类,
1
s。我不认为OP意味着多标签任务。我不认为OP意味着多标签任务。我想我真正想知道的是什么是“原始”逻辑。因为我确实很好奇我应该向
nn.CrossEntropyLoss
函数提供什么类型的输出。因此,如果我理解正确,如果我计划使用
nn.CrossEntropyLoss
,那么我应该删除
self.activnn.CrossEntropyLoss
函数提供什么类型的输出。如果我理解正确,如果我计划使用
nn.CrossEntropyLoss
然后我应该从我的上面的类中删除
self.activ
,只需将
self.conv
层的输出馈送到loss函数?@SteveAhlswede。确切地说,你是在做多类分类还是多标签分类?多类。我有一个背景类和一个n对象类和图像的每个像素都应该标记为两个类中的一个。我现在意识到,使用sigmoid作为激活函数可能是不明智的选择。因此输入图像可以有多个类,对吗?@SteveAhlswede,因为每个像素只能是两个类中的一个。这是二进制类