(继)pytorch中的pretrain模型网络结构修改
继上篇文章提出的两种预训练模型的修改方法外,今天在这里推荐我新学习到的一种方法:
那么,接下来就可以构建我们的网络了:
最后,构建一个对象,并加载resnet预训练的参数就可以啦~
这里还是以resnet模型为参考,在去掉预训练resnet模型的后两层(fc层和pooling层)后,新添加一个反卷积层、池化层和分类层。
那么对于网络的修改怎样可以快速的去除model本身的网络层呢?
一个继承nn.module的model它包含一个叫做children()的函数,这个函数可以用来提取出model每一层的网络结构,在此基础上进行修改即可,修改方法如下(去除后两层):
resnet_layer = nn.Sequential(*list(model.children())[:-2])
那么,接下来就可以构建我们的网络了:
-
class Net(nn.Module):
-
def __init__(self , model):
-
super(Net, self).__init__()
-
#取掉model的后两层
-
self.resnet_layer = nn.Sequential(*list(model.children())[:
-2])
-
-
self.transion_layer = nn.ConvTranspose2d(
2048,
2048, kernel_size=
14, stride=
3)
-
self.pool_layer = nn.MaxPool2d(
32)
-
self.Linear_layer = nn.Linear(
2048,
8)
-
-
def forward(self, x):
-
x = self.resnet_layer(x)
-
-
x = self.transion_layer(x)
-
-
x = self.pool_layer(x)
-
-
x = x.view(x.size(
0),
-1)
-
-
x = self.Linear_layer(x)
-
-
return x
最后,构建一个对象,并加载resnet预训练的参数就可以啦~
-
resnet = models.resnet50(pretrained=
True)
-
model = Net(resnet)
</div>