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()