pytorch构建双模型
第一部分:构建"se_resnet152","DPN92()"双模型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
|
import numpy as np from functools import partial import torch from torch import nn import torch.nn.functional as F from torch.optim import SGD,Adam from torch.autograd import Variable from torch.utils.data import Dataset, DataLoader from torch.optim.optimizer import Optimizer import torchvision from torchvision import models import pretrainedmodels from pretrainedmodels.models import * from torch import nn from torchvision import transforms as T import random random.seed( 2050 ) np.random.seed( 2050 ) torch.manual_seed( 2050 ) torch.cuda.manual_seed_all( 2050 ) class FCViewer(nn.Module): def forward( self , x): return x.view(x.size( 0 ), - 1 ) '''Dual Path Networks in PyTorch.''' class Bottleneck(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() if first_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) ) def forward( 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) return out class DPN(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 = [] for i,stride in enumerate (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 return nn.Sequential( * layers) def forward( 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)) return out def DPN26(): 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 ) } return DPN(cfg) def DPN92(): 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 ) } return DPN(cfg) class MultiModalNet(nn.Module): def __init__( self , backbone1, backbone2, drop, pretrained = True ): super ().__init__() if pretrained: 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) if drop > 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 ) def forward( 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) return x_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单模型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
#encoding:utf-8 import torchvision.models as models import torch import pretrainedmodels from torch import nn from torch.autograd import Variable #model = models.resnet18(pretrained=True) #print(model) #print(model._modules.keys()) #feature = torch.nn.Sequential(*list(model.children())[:-2])#模型的结构 #print(feature) ''' class FCViewer(nn.Module): def forward(self, x): return x.view(x.size(0), -1) class M(nn.Module): def __init__(self, backbone1, drop, pretrained=True): super(M,self).__init__() if pretrained: 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) if drop > 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) def forward(self, x_img): x_img = self.img_encoder(x_img) x_img = self.img_fc(x_img) return x_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) ''' ''' import torch.nn.functional as F class LenetNet(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) def forward(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) return x 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) class FCViewer(nn.Module): def forward(self, x): return x.view(x.size(0), -1) class M(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) def forward(self, x_img): x_img = self.img_encoder(x_img) x_img = self.img_fc(x_img) return x_img model2=M() test_x = Variable(torch.zeros(1, 7, 27, 24)) out=model2(test_x) print(out.shape) ''' |
以上这篇pytorch构建多模型实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/weixin_40123108/article/details/90670584