pytorch构建多模型实例
pytorch构建双模型
第一部分:构建"se_resnet152","DPN92()"双模型
importnumpyasnp fromfunctoolsimportpartial importtorch fromtorchimportnn importtorch.nn.functionalasF fromtorch.optimimportSGD,Adam fromtorch.autogradimportVariable fromtorch.utils.dataimportDataset,DataLoader fromtorch.optim.optimizerimportOptimizer importtorchvision fromtorchvisionimportmodels importpretrainedmodels frompretrainedmodels.modelsimport* fromtorchimportnn fromtorchvisionimporttransformsasT importrandom random.seed(2050) np.random.seed(2050) torch.manual_seed(2050) torch.cuda.manual_seed_all(2050) classFCViewer(nn.Module): defforward(self,x): returnx.view(x.size(0),-1) '''DualPathNetworksinPyTorch.''' classBottleneck(nn.Module): def__init__(self,last_planes,in_planes,out_planes,dense_depth,stride,first_layer): super(Bottleneck,self).__init__() self.out_planes=out_planes self.dense_depth=dense_depth self.conv1=nn.Conv2d(last_planes,in_planes,kernel_size=1,bias=False) self.bn1=nn.BatchNorm2d(in_planes) self.conv2=nn.Conv2d(in_planes,in_planes,kernel_size=3,stride=stride,padding=1,groups=32,bias=False) self.bn2=nn.BatchNorm2d(in_planes) self.conv3=nn.Conv2d(in_planes,out_planes+dense_depth,kernel_size=1,bias=False) self.bn3=nn.BatchNorm2d(out_planes+dense_depth) self.shortcut=nn.Sequential() iffirst_layer: self.shortcut=nn.Sequential( nn.Conv2d(last_planes,out_planes+dense_depth,kernel_size=1,stride=stride,bias=False), nn.BatchNorm2d(out_planes+dense_depth) ) defforward(self,x): out=F.relu(self.bn1(self.conv1(x))) out=F.relu(self.bn2(self.conv2(out))) out=self.bn3(self.conv3(out)) x=self.shortcut(x) d=self.out_planes out=torch.cat([x[:,:d,:,:]+out[:,:d,:,:],x[:,d:,:,:],out[:,d:,:,:]],1) out=F.relu(out) returnout classDPN(nn.Module): def__init__(self,cfg): super(DPN,self).__init__() in_planes,out_planes=cfg['in_planes'],cfg['out_planes'] num_blocks,dense_depth=cfg['num_blocks'],cfg['dense_depth'] self.conv1=nn.Conv2d(7,64,kernel_size=3,stride=1,padding=1,bias=False) self.bn1=nn.BatchNorm2d(64) self.last_planes=64 self.layer1=self._make_layer(in_planes[0],out_planes[0],num_blocks[0],dense_depth[0],stride=1) self.layer2=self._make_layer(in_planes[1],out_planes[1],num_blocks[1],dense_depth[1],stride=2) self.layer3=self._make_layer(in_planes[2],out_planes[2],num_blocks[2],dense_depth[2],stride=2) self.layer4=self._make_layer(in_planes[3],out_planes[3],num_blocks[3],dense_depth[3],stride=2) self.linear=nn.Linear(out_planes[3]+(num_blocks[3]+1)*dense_depth[3],64) self.bn2=nn.BatchNorm1d(64) def_make_layer(self,in_planes,out_planes,num_blocks,dense_depth,stride): strides=[stride]+[1]*(num_blocks-1) layers=[] fori,strideinenumerate(strides): layers.append(Bottleneck(self.last_planes,in_planes,out_planes,dense_depth,stride,i==0)) self.last_planes=out_planes+(i+2)*dense_depth returnnn.Sequential(*layers) defforward(self,x): out=F.relu(self.bn1(self.conv1(x))) out=self.layer1(out) out=self.layer2(out) out=self.layer3(out) out=self.layer4(out) out=F.avg_pool2d(out,4) out=out.view(out.size(0),-1) out=self.linear(out) out=F.relu(self.bn2(out)) returnout defDPN26(): cfg={ 'in_planes':(96,192,384,768), 'out_planes':(256,512,1024,2048), 'num_blocks':(2,2,2,2), 'dense_depth':(16,32,24,128) } returnDPN(cfg) defDPN92(): cfg={ 'in_planes':(96,192,384,768), 'out_planes':(256,512,1024,2048), 'num_blocks':(3,4,20,3), 'dense_depth':(16,32,24,128) } returnDPN(cfg) classMultiModalNet(nn.Module): def__init__(self,backbone1,backbone2,drop,pretrained=True): super().__init__() ifpretrained: img_model=pretrainedmodels.__dict__[backbone1](num_classes=1000,pretrained='imagenet')#seresnext101 else: img_model=pretrainedmodels.__dict__[backbone1](num_classes=1000,pretrained=None) self.visit_model=DPN26() self.img_encoder=list(img_model.children())[:-2] self.img_encoder.append(nn.AdaptiveAvgPool2d(1)) self.img_encoder=nn.Sequential(*self.img_encoder) ifdrop>0: self.img_fc=nn.Sequential(FCViewer(), nn.Dropout(drop), nn.Linear(img_model.last_linear.in_features,512), nn.BatchNorm1d(512)) else: self.img_fc=nn.Sequential( FCViewer(), nn.BatchNorm1d(img_model.last_linear.in_features), nn.Linear(img_model.last_linear.in_features,512)) self.bn=nn.BatchNorm1d(576) self.cls=nn.Linear(576,9) defforward(self,x_img,x_vis): x_img=self.img_encoder(x_img) x_img=self.img_fc(x_img) x_vis=self.visit_model(x_vis) x_cat=torch.cat((x_img,x_vis),1) x_cat=F.relu(self.bn(x_cat)) x_cat=self.cls(x_cat) returnx_cat test_x=Variable(torch.zeros(64,7,26,24)) test_x1=Variable(torch.zeros(64,3,224,224)) model=MultiModalNet("se_resnet152","DPN92()",0.1) out=model(test_x1,test_x) print(model._modules.keys()) print(model) print(out.shape)
第二部分构建densenet201单模型
#encoding:utf-8 importtorchvision.modelsasmodels importtorch importpretrainedmodels fromtorchimportnn fromtorch.autogradimportVariable #model=models.resnet18(pretrained=True) #print(model) #print(model._modules.keys()) #feature=torch.nn.Sequential(*list(model.children())[:-2])#模型的结构 #print(feature) ''' classFCViewer(nn.Module): defforward(self,x): returnx.view(x.size(0),-1) classM(nn.Module): def__init__(self,backbone1,drop,pretrained=True): super(M,self).__init__() ifpretrained: img_model=pretrainedmodels.__dict__[backbone1](num_classes=1000,pretrained='imagenet') else: img_model=pretrainedmodels.__dict__[backbone1](num_classes=1000,pretrained=None) self.img_encoder=list(img_model.children())[:-1] self.img_encoder.append(nn.AdaptiveAvgPool2d(1)) self.img_encoder=nn.Sequential(*self.img_encoder) ifdrop>0: self.img_fc=nn.Sequential(FCViewer(), nn.Dropout(drop), nn.Linear(img_model.last_linear.in_features,236)) else: self.img_fc=nn.Sequential( FCViewer(), nn.Linear(img_model.last_linear.in_features,236) ) self.cls=nn.Linear(236,9) defforward(self,x_img): x_img=self.img_encoder(x_img) x_img=self.img_fc(x_img) returnx_img model1=M('densenet201',0,pretrained=True) print(model1) print(model1._modules.keys()) feature=torch.nn.Sequential(*list(model1.children())[:-2])#模型的结构 feature1=torch.nn.Sequential(*list(model1.children())[:]) #print(feature) #print(feature1) test_x=Variable(torch.zeros(1,3,100,100)) out=feature(test_x) print(out.shape) ''' ''' importtorch.nn.functionalasF classLenetNet(nn.Module): def__init__(self): super(LenetNet,self).__init__() self.conv1=nn.Conv2d(7,6,5) self.conv2=nn.Conv2d(6,16,5) self.fc1=nn.Linear(144,120) self.fc2=nn.Linear(120,84) self.fc3=nn.Linear(84,10) defforward(self,x): x=F.max_pool2d(F.relu(self.conv1(x)),(2,2)) x=F.max_pool2d(F.relu(self.conv2(x)),2) x=x.view(x.size()[0],-1) x=F.relu(self.fc1(x)) x=F.relu(self.fc2(x)) x=self.fc3(x) returnx model1=LenetNet() #print(model1) #print(model1._modules.keys()) feature=torch.nn.Sequential(*list(model1.children())[:-3])#模型的结构 #feature1=torch.nn.Sequential(*list(model1.children())[:]) print(feature) #print(feature1) test_x=Variable(torch.zeros(1,7,27,24)) out=model1(test_x) print(out.shape) classFCViewer(nn.Module): defforward(self,x): returnx.view(x.size(0),-1) classM(nn.Module): def__init__(self): super(M,self).__init__() img_model=model1 self.img_encoder=list(img_model.children())[:-3] self.img_encoder.append(nn.AdaptiveAvgPool2d(1)) self.img_encoder=nn.Sequential(*self.img_encoder) self.img_fc=nn.Sequential(FCViewer(), nn.Linear(16,236)) self.cls=nn.Linear(236,9) defforward(self,x_img): x_img=self.img_encoder(x_img) x_img=self.img_fc(x_img) returnx_img model2=M() test_x=Variable(torch.zeros(1,7,27,24)) out=model2(test_x) print(out.shape) '''
以上这篇pytorch构建多模型实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。