networks.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. from typing import Sequence
  2. from itertools import chain
  3. import torch
  4. import torch.nn as nn
  5. from torchvision import models
  6. from .utils import normalize_activation
  7. def get_network(net_type: str):
  8. if net_type == 'alex':
  9. return AlexNet()
  10. elif net_type == 'squeeze':
  11. return SqueezeNet()
  12. elif net_type == 'vgg':
  13. return VGG16()
  14. else:
  15. raise NotImplementedError('choose net_type from [alex, squeeze, vgg].')
  16. class LinLayers(nn.ModuleList):
  17. def __init__(self, n_channels_list: Sequence[int]):
  18. super(LinLayers, self).__init__([
  19. nn.Sequential(
  20. nn.Identity(),
  21. nn.Conv2d(nc, 1, 1, 1, 0, bias=False)
  22. ) for nc in n_channels_list
  23. ])
  24. for param in self.parameters():
  25. param.requires_grad = False
  26. class BaseNet(nn.Module):
  27. def __init__(self):
  28. super(BaseNet, self).__init__()
  29. # register buffer
  30. self.register_buffer(
  31. 'mean', torch.Tensor([-.030, -.088, -.188])[None, :, None, None])
  32. self.register_buffer(
  33. 'std', torch.Tensor([.458, .448, .450])[None, :, None, None])
  34. def set_requires_grad(self, state: bool):
  35. for param in chain(self.parameters(), self.buffers()):
  36. param.requires_grad = state
  37. def z_score(self, x: torch.Tensor):
  38. return (x - self.mean) / self.std
  39. def forward(self, x: torch.Tensor):
  40. x = self.z_score(x)
  41. output = []
  42. for i, (_, layer) in enumerate(self.layers._modules.items(), 1):
  43. x = layer(x)
  44. if i in self.target_layers:
  45. output.append(normalize_activation(x))
  46. if len(output) == len(self.target_layers):
  47. break
  48. return output
  49. class SqueezeNet(BaseNet):
  50. def __init__(self):
  51. super(SqueezeNet, self).__init__()
  52. self.layers = models.squeezenet1_1(True).features
  53. self.target_layers = [2, 5, 8, 10, 11, 12, 13]
  54. self.n_channels_list = [64, 128, 256, 384, 384, 512, 512]
  55. self.set_requires_grad(False)
  56. class AlexNet(BaseNet):
  57. def __init__(self):
  58. super(AlexNet, self).__init__()
  59. self.layers = models.alexnet(True).features
  60. self.target_layers = [2, 5, 8, 10, 12]
  61. self.n_channels_list = [64, 192, 384, 256, 256]
  62. self.set_requires_grad(False)
  63. class VGG16(BaseNet):
  64. def __init__(self):
  65. super(VGG16, self).__init__()
  66. self.layers = models.vgg16(weights=models.VGG16_Weights.IMAGENET1K_V1).features
  67. self.target_layers = [4, 9, 16, 23, 30]
  68. self.n_channels_list = [64, 128, 256, 512, 512]
  69. self.set_requires_grad(False)