我正在尝试使用这个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()
)
)发布于 2019-09-05 19:18:32
如果要替换作为classifier成员的densenet121内部的model,则需要分配
model.densenet121.classifier = nn.Sequential(...)发布于 2022-08-03 16:24:55
如果我理解您的问题,下面的代码将解决
import torchvision.models as models
import torch
from torch import nn
import numpy as np
np.random.seed(0)
torch.manual_seed(0)
densenet121 = models.densenet121(pretrained=True)
for param in densenet121.parameters():
param.requires_grad = False
densenet121.classifier = nn.Sequential(
nn.Linear(1024, 14),
nn.ReLU(),
nn.Dropout(0.4),
nn.Linear(14, 2),
)
densenet121.cuda()https://stackoverflow.com/questions/57807050
复制相似问题