text: import torch.nn as nn
  import torch.nn.functional as F
  import torch.utils.model_zoo as model_zoo
  
  model_urls = {
      'resnet50': 'https://download.pytorch.org/models/resnet50-19c8e357.pth'
  }
  
  
  class FixedBatchNorm(nn.BatchNorm2d):
      def forward(self, input):
          return F.batch_norm(input, self.running_mean, self.running_var, self.weight, self.bias,
                              training=False, eps=self.eps)
  
  
  class Bottleneck(nn.Module):
      expansion = 4
  
      def __init__(self, inplanes, planes, stride=1, downsample=None, dilation=1):
          super(Bottleneck, self).__init__()
          self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False)
          self.bn1 = FixedBatchNorm(planes)
          self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride,
                                 padding=dilation, bias=False, dilation=dilation)
          self.bn2 = FixedBatchNorm(planes)
          self.conv3 = nn.Conv2d(planes, planes * 4, kernel_size=1, bias=False)
          self.bn3 = FixedBatchNorm(planes * 4)
          self.relu = nn.ReLU(inplace=True)
          self.downsample = downsample
          self.stride = stride
          self.dilation = dilation
  
      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)
          out = self.relu(out)
  
          out = self.conv3(out)
          out = self.bn3(out)
  
          if self.downsample is not None:
              residual = self.downsample(x)
  
          out += residual
          out = self.relu(out)
  
          return out
  
  
  class ResNet(nn.Module):
  
      def __init__(self, block, layers, strides=(2, 2, 2, 2), dilations=(1, 1, 1, 1)):
          self.inplanes = 64
          super(ResNet, self).__init__()
          self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=strides[0], padding=3,
                                 bias=False)
          self.bn1 = FixedBatchNorm(64)
          self.relu = nn.ReLU(inplace=True)
          self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
          self.layer1 = self._make_layer(block, 64, layers[0], stride=1, dilation=dilations[0])
          self.layer2 = self._make_layer(block, 128, layers[1], stride=strides[1], dilation=dilations[1])
          self.layer3 = self._make_layer(block, 256, layers[2], stride=strides[2], dilation=dilations[2])
          self.layer4 = self._make_layer(block, 512, layers[3], stride=strides[3], dilation=dilations[3])
          self.inplanes = 1024
  
          # self.avgpool = nn.AvgPool2d(7, stride=1)
          # self.fc = nn.Linear(512 * block.expansion, 1000)
  
      def _make_layer(self, block, planes, blocks, stride=1, dilation=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),
                  FixedBatchNorm(planes * block.expansion),
              )
  
          layers = [block(self.inplanes, planes, stride, downsample, dilation=1)]
          self.inplanes = planes * block.expansion
          for i in range(1, blocks):
              layers.append(block(self.inplanes, planes, dilation=dilation))
  
          return nn.Sequential(*layers)
  
      def forward(self, x):
          x = self.conv1(x)
          x = self.bn1(x)
          x = self.relu(x)
          x = self.maxpool(x)
  
          x = self.layer1(x)
          x = self.layer2(x)
          x = self.layer3(x)
          x = self.layer4(x)
  
          x = self.avgpool(x)
          x = x.view(x.size(0), -1)
          x = self.fc(x)
  
          return x
  
  
  def resnet50(pretrained=True, **kwargs):
      model = ResNet(Bottleneck, [3, 4, 6, 3], **kwargs)
      if pretrained:
          state_dict = model_zoo.load_url(model_urls['resnet50'])
          state_dict.pop('fc.weight')
          state_dict.pop('fc.bias')
          model.load_state_dict(state_dict)
      return model
  