| import torch |
| import torch.nn as nn |
|
|
|
|
| def conv3x3(in_planes, out_planes, stride=1): |
|
|
| return nn.Conv2d( |
| in_planes, out_planes, kernel_size=3, stride=stride, padding=1, bias=False |
| ) |
|
|
|
|
| class BasicBlock(nn.Module): |
| expansion = 1 |
|
|
| def __init__(self, inplanes, planes, stride=1, downsample=None): |
| super(BasicBlock, self).__init__() |
| self.conv1 = conv3x3(inplanes, planes, stride) |
| self.bn1 = nn.BatchNorm2d(planes, eps=1e-05) |
| self.relu = nn.ReLU(inplace=True) |
| self.conv2 = conv3x3(planes, planes) |
| self.bn2 = nn.BatchNorm2d(planes, eps=1e-05) |
| self.downsample = downsample |
| self.stride = stride |
|
|
| def forward(self, x): |
| residual = x |
|
|
| out = self.conv1(x) |
| out = self.bn1(out) |
| out = self.relu(out) |
|
|
| out = self.conv2(out) |
| out = self.bn2(out) |
|
|
| if self.downsample is not None: |
| residual = self.downsample(x) |
|
|
| out += residual |
| out = self.relu(out) |
|
|
| return out |
|
|
|
|
| class ResNet18(nn.Module): |
|
|
| def __init__(self, nb_feat=384): |
|
|
| self.inplanes = nb_feat // 4 |
| super(ResNet18, self).__init__() |
| self.conv1 = nn.Conv2d( |
| 1, nb_feat // 4, kernel_size=3, stride=(2, 1), padding=1, bias=False |
| ) |
| self.bn1 = nn.BatchNorm2d(nb_feat // 4, eps=1e-05) |
| self.relu = nn.ReLU(inplace=True) |
| self.maxpool1 = nn.MaxPool2d(kernel_size=3, stride=(2, 1), padding=1) |
| self.maxpool2 = nn.MaxPool2d(kernel_size=3, stride=(1, 1), padding=1) |
| self.layer1 = self._make_layer(BasicBlock, nb_feat // 4, 2, stride=(2, 2)) |
| self.layer2 = self._make_layer(BasicBlock, nb_feat // 2, 2, stride=2) |
| self.layer3 = self._make_layer(BasicBlock, nb_feat, 2, stride=2) |
|
|
| def _make_layer(self, block, planes, blocks, stride=1): |
| downsample = None |
| if stride != 1 or self.inplanes != planes * block.expansion: |
| downsample = nn.Sequential( |
| nn.Conv2d( |
| self.inplanes, |
| planes * block.expansion, |
| kernel_size=1, |
| stride=stride, |
| bias=False, |
| ), |
| nn.BatchNorm2d(planes * block.expansion, eps=1e-05), |
| ) |
|
|
| layers = [] |
| layers.append(block(self.inplanes, planes, stride, downsample)) |
| self.inplanes = planes * block.expansion |
| for i in range(1, blocks): |
| layers.append(block(self.inplanes, planes, 1, None)) |
|
|
| return nn.Sequential(*layers) |
|
|
| def forward(self, x): |
| x = self.conv1(x) |
| x = self.bn1(x) |
| x = self.relu(x) |
| x = self.maxpool1(x) |
|
|
| x = self.layer1(x) |
| x = self.layer2(x) |
| x = self.layer3(x) |
| x = self.maxpool2(x) |
|
|
| return x |
| |
| class VGG11(nn.Module): |
|
|
| def __init__(self, hidden=384): |
| super(VGG11, self).__init__() |
|
|
| self.features = nn.Sequential( |
|
|
| nn.Conv2d(1,64,3,1,1), |
| nn.BatchNorm2d(64), |
| nn.ReLU(True), |
| nn.MaxPool2d(2,2), |
|
|
| nn.Conv2d(64,128,3,1,1), |
| nn.BatchNorm2d(128), |
| nn.ReLU(True), |
| nn.MaxPool2d(2,2), |
|
|
| nn.Conv2d(128,256,3,1,1), |
| nn.BatchNorm2d(256), |
| nn.ReLU(True), |
|
|
| nn.Conv2d(256,256,3,1,1), |
| nn.BatchNorm2d(256), |
| nn.ReLU(True), |
| nn.MaxPool2d((2,1),(2,1)), |
|
|
| nn.Conv2d(256,512,3,1,1), |
| nn.BatchNorm2d(512), |
| nn.ReLU(True), |
|
|
| nn.Conv2d(512,512,3,1,1), |
| nn.BatchNorm2d(512), |
| nn.ReLU(True), |
| nn.MaxPool2d((2,1),(2,1)), |
|
|
| nn.Conv2d(512,hidden,2,1,0), |
| nn.BatchNorm2d(hidden), |
| nn.ReLU(True), |
| ) |
|
|
| def forward(self,x): |
| return self.features(x) |
|
|
|
|
| class VGG19(nn.Module): |
|
|
| def __init__(self, hidden=384): |
| super(VGG19, self).__init__() |
|
|
| self.features = nn.Sequential( |
|
|
| nn.Conv2d(1,64,3,1,1), |
| nn.BatchNorm2d(64), |
| nn.ReLU(True), |
|
|
| nn.Conv2d(64,64,3,1,1), |
| nn.BatchNorm2d(64), |
| nn.ReLU(True), |
| nn.MaxPool2d(2,2), |
|
|
| nn.Conv2d(64,128,3,1,1), |
| nn.BatchNorm2d(128), |
| nn.ReLU(True), |
|
|
| nn.Conv2d(128,128,3,1,1), |
| nn.BatchNorm2d(128), |
| nn.ReLU(True), |
| nn.MaxPool2d(2,2), |
|
|
| nn.Conv2d(128,256,3,1,1), |
| nn.BatchNorm2d(256), |
| nn.ReLU(True), |
|
|
| nn.Conv2d(256,256,3,1,1), |
| nn.BatchNorm2d(256), |
| nn.ReLU(True), |
|
|
| nn.Conv2d(256,256,3,1,1), |
| nn.BatchNorm2d(256), |
| nn.ReLU(True), |
|
|
| nn.Conv2d(256,256,3,1,1), |
| nn.BatchNorm2d(256), |
| nn.ReLU(True), |
| nn.MaxPool2d((2,1),(2,1)), |
|
|
| nn.Conv2d(256,512,3,1,1), |
| nn.BatchNorm2d(512), |
| nn.ReLU(True), |
|
|
| nn.Conv2d(512,512,3,1,1), |
| nn.BatchNorm2d(512), |
| nn.ReLU(True), |
|
|
| nn.Conv2d(512,512,3,1,1), |
| nn.BatchNorm2d(512), |
| nn.ReLU(True), |
|
|
| nn.Conv2d(512,512,3,1,1), |
| nn.BatchNorm2d(512), |
| nn.ReLU(True), |
| nn.MaxPool2d((2,1),(2,1)), |
|
|
| nn.Conv2d(512,hidden,2,1,0), |
| nn.BatchNorm2d(hidden), |
| nn.ReLU(True), |
| ) |
|
|
| def forward(self,x): |
| return self.features(x) |
|
|