class_docstr: Hand-tuned architecture for MNIST.
  Weirdness I've noticed so far with this architecture:
  - adding a linear layer after the mean-pool in features hurts
      RotatedMNIST-100 generalization severely.
class_docstr_tok: ["Hand-tuned","architecture","for","MNIST",".","Weirdness","I","'ve","noticed","so","far","with","this","architecture",":","-","adding","a","linear","layer","after","the","mean-pool","in","features","hurts","RotatedMNIST-100","generalization","severely","."]
code: def __init__(self, input_shape):
      super(MNIST_CNN, self).__init__()
      self.conv1 = nn.Conv2d(input_shape[0], 64, 3, 1, padding=1)
      self.conv2 = nn.Conv2d(64, 128, 3, stride=2, padding=1)
      self.conv3 = nn.Conv2d(128, 128, 3, 1, padding=1)
      self.conv4 = nn.Conv2d(128, 128, 3, 1, padding=1)
  
      self.bn0 = nn.GroupNorm(8, 64)
      self.bn1 = nn.GroupNorm(8, 128)
      self.bn2 = nn.GroupNorm(8, 128)
      self.bn3 = nn.GroupNorm(8, 128)
  
      self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
  
imports: import torch
  import torch.nn
  import torch.nn.functional
  import torchvision.models
label_desc: Use image node_id 1 to create a new MNIST_CNN object from inherited base classes: nn with example: obj = MNIST_CNN(input_shape)