Helper Module for Deep Learning.
Source code for pynet.models.cam
# -*- coding: utf-8 -*-
##########################################################################
# NSAp - Copyright (C) CEA, 2019
# Distributed under the terms of the CeCILL-B license, as published by
# the CEA-CNRS-INRIA. Refer to the LICENSE file or to
# http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
# for details.
##########################################################################
"""
Module that provides reorganized networks to perform class activation map.
Networks must have features/classifier methods for the convolutional part of
the network, and the fully connected part.
"""
# Imports
import collections
import torchvision.models as models
import torch.nn as nn
import torch.nn.functional as func
# Global parameters
CAM_NETWORKS = {
"vgg19": "35",
"densenet201": "norm5",
"resnet18": "layer4",
"inception_v3": "Mixed_7c"
}
[docs]def get_cam_network(name):
""" Reorganized a network to provide a features/classifier methods for the
convolutional part of the network, and the fully connected part.
Parameters
----------
name: str
the name of the network.
Returns
-------
model: instance
the pretrained/reorganized model.
activation_layer_name: str
the name of the activation layer in the network.
"""
if name not in CAM_NETWORKS:
raise ValueError("'{0}' network is not yet supported.".format(name))
model = getattr(models, name)(pretrained=True)
activation_layer_name = CAM_NETWORKS[name]
if name == "resnet18":
model = nn.Sequential(collections.OrderedDict([
("features", nn.Sequential(collections.OrderedDict(
list(model.named_children())[:-2]))),
("pool", model.avgpool),
("classifier", model.fc)
]))
elif name == "densenet201":
model = nn.Sequential(collections.OrderedDict([
("features", model.features),
("pool", nn.AvgPool2d(kernel_size=7, stride=1)),
("classifier", model.classifier)
]))
elif name == "inception_v3":
class Inception3_features(nn.Module):
def __init__(self, model):
super(Inception3_features, self).__init__()
self.part1 = nn.Sequential(collections.OrderedDict([
(name, mod)
for name, mod in list(model.named_children())[:3]]))
self.part2 = nn.Sequential(collections.OrderedDict([
(name, mod)
for name, mod in list(model.named_children())[3: 5]]))
def forward(self, x):
x = self.part1(x)
x = func.max_pool2d(x, kernel_size=3, stride=2)
x = self.part2(x)
x = func.max_pool2d(x, kernel_size=3, stride=2)
return x
features_mods = [
(name, mod)
for name, mod in list(model.named_children())[5: -1]
if name != "AuxLogits"]
model = nn.Sequential(collections.OrderedDict([
("pre", Inception3_features(model)),
("features", nn.Sequential(
collections.OrderedDict(features_mods))),
("pool", nn.AvgPool2d(kernel_size=5)),
("classifier", model.fc)
]))
return model, activation_layer_name
Follow us
© 2019, pynet developers .
Inspired by AZMIND template.
Inspired by AZMIND template.