无法在 PyTorch 中替换 Densenet121 上的分类器

Can't replace classifier on Densenet121 in pytorch

我正在尝试使用此 github DenseNet121 模型 (https://github.com/gaetandi/cheXpert.git) 进行一些迁移学习。我 运行 遇到将分类层从 14 个输出调整为 2 个输出的问题。

github代码的相关部分是:

class DenseNet121(nn.Module):
    """Model modified.
    The architecture of our model is the same as standard DenseNet121
    except the classifier layer which has an additional sigmoid function.
    """
    def __init__(self, out_size):
        super(DenseNet121, self).__init__()
        self.densenet121 = torchvision.models.densenet121(pretrained=True)
        num_ftrs = self.densenet121.classifier.in_features
        self.densenet121.classifier = nn.Sequential(
            nn.Linear(num_ftrs, out_size),
            nn.Sigmoid()
        )
def forward(self, x):
    x = self.densenet121(x)
    return x

我加载并初始化:

# initialize and load the model
model = DenseNet121(nnClassCount).cuda()
model = torch.nn.DataParallel(model).cuda()
modeldict = torch.load("model_ones_3epoch_densenet.tar")
model.load_state_dict(modeldict['state_dict'])

看起来 DenseNet 不会将层拆分为子层,因此 model = nn.Sequential(*list(modelRes.children())[:-1]) 无法正常工作。

model.classifier = nn.Linear(1024, 2) 似乎在默认的 DenseNets 上工作,但是这里使用修改后的分类器(附加 sigmoid 函数)最终只是添加了一个额外的分类器层而没有替换原来的。

我试过了

model.classifier = nn.Sequential(
    nn.Linear(1024, dset_classes_number), 
    nn.Sigmoid()
)

但是我有相同的添加而不是替换分类器问题:

...
      )
      (classifier): Sequential(
        (0): Linear(in_features=1024, out_features=14, bias=True)
        (1): Sigmoid()
      )
    )
  )
  (classifier): Sequential(
    (0): Linear(in_features=1024, out_features=2, bias=True)
    (1): Sigmoid()
  )
)

如果你想替换 densenet121 里面的 classifier 是你的 model 的成员,你需要分配

model.densenet121.classifier = nn.Sequential(...)