44 lines
1.5 KiB
Python
44 lines
1.5 KiB
Python
import torch.nn as nn
|
|
import torch.nn.functional as F
|
|
from torch import set_grad_enabled
|
|
from .nets_utils import EmbeddingRecorder
|
|
|
|
|
|
# Acknowledgement to
|
|
# https://github.com/kuangliu/pytorch-cifar,
|
|
# https://github.com/BIGBALLON/CIFAR-ZOO,
|
|
|
|
class LeNet(nn.Module):
|
|
def __init__(self, channel, num_classes, im_size, record_embedding: bool = False, no_grad: bool = False,
|
|
pretrained: bool = False):
|
|
if pretrained:
|
|
raise NotImplementedError("torchvison pretrained models not available.")
|
|
super(LeNet, self).__init__()
|
|
self.features = nn.Sequential(
|
|
nn.Conv2d(channel, 6, kernel_size=5, padding=2 if channel == 1 else 0),
|
|
nn.ReLU(inplace=True),
|
|
nn.MaxPool2d(kernel_size=2, stride=2),
|
|
nn.Conv2d(6, 16, kernel_size=5),
|
|
nn.ReLU(inplace=True),
|
|
nn.MaxPool2d(kernel_size=2, stride=2),
|
|
)
|
|
self.fc_1 = nn.Linear(16 * 53 * 53 if im_size[0] == im_size[1] == 224 else 16 * 5 * 5, 120)
|
|
self.fc_2 = nn.Linear(120, 84)
|
|
self.fc_3 = nn.Linear(84, num_classes)
|
|
|
|
self.embedding_recorder = EmbeddingRecorder(record_embedding)
|
|
self.no_grad = no_grad
|
|
|
|
def get_last_layer(self):
|
|
return self.fc_3
|
|
|
|
def forward(self, x):
|
|
with set_grad_enabled(not self.no_grad):
|
|
x = self.features(x)
|
|
x = x.view(x.size(0), -1)
|
|
x = F.relu(self.fc_1(x))
|
|
x = F.relu(self.fc_2(x))
|
|
x = self.embedding_recorder(x)
|
|
x = self.fc_3(x)
|
|
return x
|