def __init__(self, num_classes 1001, zero_init_residual False):
super(InceptionResNetV2, self).__init__()
# Special attributs
self.input_space None
self.input_size (299, 299, 3)
self.mean None
self.std None
# Modules
self.conv2d_1a BasicConv2d(3, 32, kernel_size 3, stride 2)
self.conv2d_2a BasicConv2d(32, 32, kernel_size 3, stride 1)
self.conv2d_2b BasicConv2d(32, 64, kernel_size 3, stride 1, padding 1)
self.maxpool_3a nn.MaxPool2d(3, stride 2)
self.conv2d_3b BasicConv2d(64, 80, kernel_size 1, stride 1)
self.conv2d_4a BasicConv2d(80, 192, kernel_size 3, stride 1)
self.maxpool_5a nn.MaxPool2d(3, stride 2)
self.mixed_5b Mixed_5b()
self.repeat nn.Sequential(
Block35(scale 0.17),
Block35(scale 0.17),
Block35(scale 0.17),
Block35(scale 0.17),
Block35(scale 0.17),
Block35(scale 0.17),
Block35(scale 0.17),
Block35(scale 0.17),
Block35(scale 0.17),
Block35(scale 0.17)
self.mixed_6a Mixed_6a()
self.repeat_1 nn.Sequential(
Block17(scale 0.10),
Block17(scale 0.10),
Block17(scale 0.10),
Block17(scale 0.10),
Block17(scale 0.10),
Block17(scale 0.10),
Block17(scale 0.10),
Block17(scale 0.10),
Block17(scale 0.10),
Block17(scale 0.10),
Block17(scale 0.10),
Block17(scale 0.10),
Block17(scale 0.10),
Block17(scale 0.10),
Block17(scale 0.10),
Block17(scale 0.10),
Block17(scale 0.10),
Block17(scale 0.10),
Block17(scale 0.10),
Block17(scale 0.10)
self.mixed_7a Mixed_7a()
self.repeat_2 nn.Sequential(
Block8(scale 0.20),
Block8(scale 0.20),
Block8(scale 0.20),
Block8(scale 0.20),
Block8(scale 0.20),
Block8(scale 0.20),
Block8(scale 0.20),
Block8(scale 0.20),
Block8(scale 0.20)
self.block8 Block8(noReLU True)
self.conv2d_7b BasicConv2d(2080, 1536, kernel_size 1, stride 1)
self.avgpool_1a nn.AvgPool2d(5, count_include_pad False)
self.bottleneck nn.Sequential(
nn.Linear(1536, 512),
nn.BatchNorm1d(512),
nn.ReLU(),
nn.Dropout(0.5)
self.bottleneck[0].weight.data.normal_(0, 0.005)
self.bottleneck[0].bias.data.fill_(0.1)
self.head nn.Sequential(
nn.Linear(512, 512),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(512, num_classes)
# self.fc nn.Linear(512, num_classes)
for dep in range(2):
self.head[dep * 3].weight.data.normal_(0, 0.01)
self.head[dep * 3].bias.data.fill_(0.0)
for m in self.modules():
if isinstance(m, nn.Conv2d):
nn.init.kaiming_normal_(m.weight, mode fan_out , nonlinearity relu )
elif isinstance(m, (nn.BatchNorm2d, nn.GroupNorm)):
nn.init.constant_(m.weight, 1)
nn.init.constant_(m.bias, 0)
if zero_init_residual:
for m in self.modules():
if isinstance(m, Bottleneck):
nn.init.constant_(m.bn3.weight, 0)
elif isinstance(m, BasicBlock):
nn.init.constant_(m.bn2.weight, 0)
def features(self, input):
x self.conv2d_1a(input)
x self.conv2d_2a(x)
x self.conv2d_2b(x)
x self.maxpool_3a(x)
x self.conv2d_3b(x)
x self.conv2d_4a(x)
x self.maxpool_5a(x)
x self.mixed_5b(x)
x self.repeat(x)
x self.mixed_6a(x)
x self.repeat_1(x)
x self.mixed_7a(x)
x self.repeat_2(x)
x self.block8(x)
x self.conv2d_7b(x)
return x
def logits(self, features):
x self.avgpool_1a(features)
# print( x1.size {} .format(x.shape))
x x.view(x.size(0), -1)
# print( x2.size {} .format(x.shape))
x self.bottleneck(x)
x self.head(x)
# x self.last_linear(x)
return x
def forward(self, input):
x self.features(input)
# print( x0.size {} .format(x.shape))
x self.logits(x)
return x
def inceptionresnetv2(num_classes 1000, pretrained imagenet ):
r InceptionResNetV2 model architecture from the
InceptionV4, Inception-ResNet... https://arxiv.org/abs/1602.07261 _ paper.
if pretrained:
pretrained imagenet background
num_classes_hat 1001
settings pretrained_settings[ inceptionresnetv2 ][pretrained]
# print(settings)
# print( num %dn ,num_classes)
# assert num_classes settings[ num_classes ],
# num_classes should be {}, but is {} .format(settings[ num_classes ], num_classes)
# both imagenet imagenet background are loaded from same parameters
model InceptionResNetV2(num_classes num_classes_hat)
model.load_state_dict(model_zoo.load_url(settings[ url ]), strict False)
# if pretrained imagenet background :
# # print( yes )
# # model.last_linear nn.Linear(1536, num_classes).cuda()
# new_last_linear nn.Linear(1536, num_classes).cuda()
# new_last_linear.weight.data model.last_linear.weight.data[1:]
# new_last_linear.bias.data model.last_linear.bias.data[1:]
# model.last_linear new_last_linear
model.input_space settings[ input_space ]
model.input_size settings[ input_size ]
model.input_range settings[ input_range ]
model.mean settings[ mean ]
model.std settings[ std ]
else:
model InceptionResNetV2(num_classes num_classes)
return model