无法在 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(...)
我正在尝试使用此 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(...)