pytorch 使用Imagenet预训练模型训练

1、loading models

#加载以resnet50为例子
import torchvision as p

model = p.models.resnet50(pretrained=True)

   此时加载数据模型以后,我们要是思考如何利用它,但是在此之前你必须了解你加载的模型的结构。

2、处理分类数据

   如果是用来处理分类数据:

  你只需要替换最后一个全连接分类进行输出。

model.fc = nn.Sequential(nn.Linear(2048,num_classes))
######

3、作为模型的backbone

   如果你需要作为要做模型的bacbone,比如RCNN、Semantic Segment等,此时你要将这些模型预加载进行来,以下面的一个FCN8-语义切割为例子:

  这里的model就是之前Resnet50model that has pretrained Imageset dataset

class FCN(nn.Module):
    def __init__(self):
        super(FCN,self).__init__()
        self.layer1 = nn.Conv2d(256,nClasses,1,stride=1,padding=0,bias=True)
        self.trans = nn.ConvTranspose2d(nClasses,nClasses,2,stride=2,padding=0,bias=True)
        self.layer2 = nn.Conv2d(128,nClasses,1,stride=1,padding=0,bias=True)
        self.up = nn.ConvTranspose2d(nClasses,nClasses,8,stride=8,padding=0,bias=True)
        for m in self.modules():
            if isinstance(m,nn.Conv2d) or isinstance(m,nn.ConvTranspose2d):
                #m.weight.detach().normal_(0,0.01)
                nn.init.xavier_uniform(m.weight.data)
                m.bias.detach().zero_()
    def forward(self,x,model):
        x = model.conv1(x)
        x = model.bn1(x)
        x = model.relu(x)
        x = model.maxpool(x)
        x = model.layer1(x)
        x1 = model.layer2(x)
        x2 = model.layer3(x1)
        #layers.append(x)#20
        x = model.layer4(x2)
        x = model.avgpool(x)#20
        skip = self.layer1(x2)
        y = skip + x
        c = self.trans(y)
        #### 40
        v = self.layer2(x1)
        y = c+v
        x = self.up(y)
        return x

 当然还有其他写法,比如直接类的构造函数里面,你先取出来后面也是非常简单了:

values = []
for m in model.modules():
    values.append(m)
#nn.Sequential()

 

你可能感兴趣的:(深度学习)