def get_resnet(type, load_ckpt=True): """ loading ResNet of trained on places365 as basenet """ if type == 18: model_file = 'Place365/wideresnet18_places365.pth.tar' model_res_net = wideresnet.resnet18(num_classes=365) elif type == 34: model_file = 'Place365/resnet34-333f7ec4.pth' # Pre-trained on ImageNet model_res_net = wideresnet.resnet34() elif type == 50: model_file = 'Place365/resnet50_places365.pth.tar' model_res_net = wideresnet.resnet50(num_classes=365) else: raise Exception('Unknown ResNet Type') if load_ckpt: try: checkpoint = torch.load(model_file, map_location=lambda storage, loc: storage) except IOError: print('Fail to load checkpoint, because no such file:', model_file) else: if type == 34: model_res_net.load_state_dict(checkpoint) else: state_dict = { str.replace(k, 'module.', ''): v for k, v in checkpoint['state_dict'].items() } model_res_net.load_state_dict(state_dict) return model_res_net
def baseResNet(type=50): from Place365 import wideresnet if type == 18: model_res_net = wideresnet.resnet18(num_classes=365) elif type == 34: model_res_net = wideresnet.resnet34() elif type == 50: model_res_net = wideresnet.resnet50(num_classes=365) else: raise Exception('Unknown ResNet Type') layers = list(model_res_net.children())[:-2] # children()只包括了第一代儿子模块,get rid of the last two layers: avepool & fc return layers
def get_resnet(type): """ loading ResNet-18/34/50 of trained on places365 (ImageNet) as basenet """ from Place365 import wideresnet if type == 18: model_file = 'Place365/wideresnet18_places365.pth.tar' model_res_net = wideresnet.resnet18(num_classes=365) elif type == 34: model_file = 'Place365/resnet34-333f7ec4.pth' # Pre-trained on ImageNet model_res_net = wideresnet.resnet34() elif type == 50: model_file = 'Place365/resnet50_places365.pth.tar' model_res_net = wideresnet.resnet50(num_classes=365) else: raise Exception('Unknown ResNet Type') return model_res_net, model_file
def loadSceneRecognitionModel(trainedNetVLADLayers): # this model has a last conv feature map as 14x14 model_file = 'Place365/wideresnet18_places365.pth.tar' model = wideresnet.resnet18(num_classes=365) state_dict = getPretrainedParams(model_file) model.load_state_dict(state_dict) model.eval() # hook the feature extractor features_names = ['layer4', 'avgpool'] # this is the last conv layer of the resnet for name in features_names: model._modules.get(name).register_forward_hook(hook_feature) # hook the layer for DataSet features_candidates = ['layer4', 'layer3', 'layer2', 'layer1', 'relu1'] model._modules.get(features_candidates[trainedNetVLADLayers]).register_forward_hook(hook_layer) return model
encoder_dim = 512 encoder = models.vgg16(pretrained=pretrained) # capture only feature part and remove last relu and maxpool layers = list(encoder.features.children())[:-2] if pretrained: # if using pretrained then only train conv5_1, conv5_2, and conv5_3 for l in layers[:-5]: for p in l.parameters(): p.requires_grad = False elif opt.arch.lower() == 'resnet18': encoder_dim = 512 # loading resnet18 of trained on places365 as basenet from Place365 import wideresnet model_file = 'Place365/wideresnet18_places365.pth.tar' modelResNet = wideresnet.resnet18(num_classes=365) checkpoint = torch.load(model_file, map_location=lambda storage, loc: storage) state_dict = { str.replace(k, 'module.', ''): v for k, v in checkpoint['state_dict'].items() } modelResNet.load_state_dict(state_dict) # get rid of the last two layers: avepool & fc layers = list(modelResNet.children())[:-2] # 让最后1\2个block参与netVLAD训练 for l in layers[:-2]: for p in l.parameters(): p.requires_grad = False if opt.mode.lower() == 'cluster':