在FCN_ResNet101 Pytorch中冻结除FCN头以外的所有层

时间:2019-12-20 14:57:54

标签: pytorch torch

我想微调FCN_ResNet101。我想更改最后一层,因为我的数据集具有不同数量的类。此外,仅微调FCN磁头。 对于前者,在定义模型时仅更改num_classes参数就足够了,还是我需要使用类似以下的内容:

model = torchvision.models.segmentation.fcn_resnet101(pretrained=True)
model.classifier=nn.identity()
model.Conv2d = nn.Conv2d(
in_channels=256,
out_channels=nb_classes,
kernel_size=1,
stride=1
)

我从另一个线程获取了这段代码。我不确定是否需要使用nn.identity()。当我这样做时,最后一层不会改变,而是最后一层到最后一个FCN的最后一层! 而且,必须更改几层,才能重新设置我的FCN头? 我是这样写的,但是我对FCN_ResNet101的体系结构感到困惑。

model = torchvision.models.segmentation.fcn_resnet101(pretrained=True, progress=True, num_classes=?)
#model.classifier[4] = nn.Identity()

“”"
FCNHead(
(0): Conv2d(2048, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
(1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU()
(3): Dropout(p=0.1)
(4): Conv2d(512, 21, kernel_size=(1, 1), stride=(1, 1))
), FCNHead(
(0): Conv2d(1024, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
(1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU()
(3): Dropout(p=0.1)
(4): Conv2d(256, 21, kernel_size=(1, 1), stride=(1, 1))
)]
“”"

#setting our own number of classes

layer_list = list(model.children())[-5:]
model_small = nn.Sequential(*list(model.children()))[-5:]

for param in model_small.parameters():
param.requires_grad = False

model_small.Conv2d = nn.Conv2d( in_channels=1024,kernel_size=(3,3),stride=(1,1))
model_small.BatchNorm2d = nn.BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
model_small.ReLU = nn.ReLU()
model_small.Dropout = nn.Dropout(p=0.1)
model_small.Conv2d = nn.Conv2d(
in_channels=256,
out_channels=nb_classes,
kernel_size=1,
stride=1
)
model = model_small.to(device)

非常感谢任何指导!

0 个答案:

没有答案