Machine learning 如何使用Pytorch创建一个自定义的EfficientNet,并正确写入最后一层

Machine learning 如何使用Pytorch创建一个自定义的EfficientNet,并正确写入最后一层,machine-learning,deep-learning,pytorch,classification,conv-neural-network,Machine Learning,Deep Learning,Pytorch,Classification,Conv Neural Network,我有一个分类问题要预测8个类,例如,我在pytorch中使用EfficientNetB3。然而,我对自定义类的编写是否正确感到困惑。我想我想剥离预训练模型的最后一层,以适应8个输出,对吗?我做得对吗?因为当我在我的DataLoader中打印y\u preds=model(images)时,它似乎给了我1536预测。这是预期的行为吗 !pip install geffnet import geffnet class EfficientNet(nn.Module): def __init

我有一个分类问题要预测8个类,例如,我在pytorch中使用
EfficientNetB3
。然而,我对自定义类的编写是否正确感到困惑。我想我想剥离预训练模型的最后一层,以适应8个输出,对吗?我做得对吗?因为当我在我的
DataLoader
中打印
y\u preds=model(images)
时,它似乎给了我
1536
预测。这是预期的行为吗

!pip install geffnet 
import geffnet

class EfficientNet(nn.Module):
    def __init__(self, config):
        super().__init__()
        self.config = config
        self.model = geffnet.create_model(config.effnet, pretrained=True)
        n_features = self.model.classifier.in_features
        # does the name fc matter?
        self.fc = nn.Linear(n_features, config.num_classes)
        self.model.classifier = nn.Identity()
        
    def extract(self, x):
        x = self.model(x)
        return x

    def forward(self, x):
        x = self.extract(x).squeeze(-1).squeeze(-1)
        return x
    
model = EfficientNet(config=config)
if torch.cuda.is_available():
    model.cuda()
打印的示例代码
y\u pred

device=torch.device('cuda'如果torch.cuda.is_可用(),则为'cpu')


在向前传球时,你甚至没有使用self.fc

或者只是介绍一下:

def forward(self, x):
    ....
    x = extract(x)...
    x = fc(x)
    return x
或者您可以简单地替换名为classifier的层(这样您就不需要标识层):


另外,这里的
config.num\u类
应该是8。

在向前传球中甚至没有使用
self.fc

或者只是介绍一下:

def forward(self, x):
    ....
    x = extract(x)...
    x = fc(x)
    return x
或者您可以简单地替换名为classifier的层(这样您就不需要标识层):


另外,这里的
config.num\u类应该是8。

非常感谢您的解释,如果可以的话,还有一个问题,为什么我们需要
self.extract(x).squeak(-1).squeak(-1)
forward
过程中,我们不能说:
x=self.model(x)
并删除
extract
方法?删除1的额外维度,此处不需要它。您可以直接调用self.model(x)。我不知道你当初为什么要用它。谢谢你的回复,谢谢。您想什么时候使用挤压tho?正如我看到的一些人所做的那样。有时,你可能会得到额外的维度,比如(1,1,3,224,224),为了使它与其他可能只适用于4维的操作兼容,你可以使用挤压。您也可能会使用
unsqeeze()
例如,在输入大小为(3,224,224)的单个图像张量进行建模之前,使其大小变为(1,3,224,224),因为pytorch要求形状为[N,C,H,W],其中N是批次大小。清晰的解释。如果可以的话,我会给你两次投票。非常感谢你的解释,如果可以的话,我还要问一个问题,为什么我们需要
self.extract(x).square(-1).square(-1)
向前
过程中,为什么我们不能说:
x=self.model(x)
并删除
extract
方法?删除1的额外维度,此处不需要它。您可以直接调用self.model(x)。我不知道你当初为什么要用它。谢谢你的回复,谢谢。您想什么时候使用挤压tho?正如我看到的一些人所做的那样。有时,你可能会得到额外的维度,比如(1,1,3,224,224),为了使它与其他可能只适用于4维的操作兼容,你可以使用挤压。您也可能会使用
unsqeeze()
例如,在输入大小为(3,224,224)的单个图像张量进行建模之前,使其大小变为(1,3,224,224),因为pytorch要求形状为[N,C,H,W],其中N是批次大小。清晰的解释。如果可以的话,我会投你两次票。
self.model.classifier = nn.Linear(n_features, config.num_classes)