Hello,
I am trying to program an 8-layered toy network that accepts a 32 x 32 colored image into Pytorch by following the table, but I get an error when the input to the first f.c. layer has incorrect number of in_features (1x784 as opposed to 1x3136).
Can someone point out what I missed? I followed the formula:
image1103×309 24.1 KB
But in reality, torch gives me , which I am confused about because it does not follow the formula.
Either method does not lead to the desired output, which is , and would give me the correct in_features for the 1st fc layer.
Hoping that someone can help me find my mistake. I have attached the table and my code below. Thank you.
image802×420 56.3 KB
And here is my code:
import torch
import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
  def __init__(self, max_epochs = 10, learning_rate=0.01, num_classes=10):
    super(Net, self).__init__()

    # Model
    self.conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, stride=1) 
    self.conv1_bn = nn.BatchNorm2d(64)
    
    self.conv2 = nn.Conv2d(64, 128, 3, 1)
    self.conv2_bn = nn.BatchNorm2d(128)

    self.conv3 = nn.Conv2d(128, 196, 3, 1)
    self.conv3_bn = nn.BatchNorm2d(196)

    self.fc1 = nn.Linear(in_features=3136, out_features=256)
    self.fc1_bn = nn.BatchNorm1d(256)

    self.fc2 = nn.Linear(256, num_classes)

  def forward(self, x):
    x = self.conv1(x)
    x = self.conv1_bn(x)
    x = F.relu(x)
    x = F.max_pool2d(x, kernel_size=2, stride=2)
    # Outputs 1 x 64 x 15 x 15
    
    x = self.conv2(x)
    x = self.conv2_bn(x)
    # Outputs 1 x 128 x 13 x 13

    x = F.relu(x)
    x = F.max_pool2d(x, kernel_size=2, stride=2)
    # Outputs 1 x 128 x 6 x 6,  but shouldn't it be 1 x 128 x 8 x 8 ?

    x = self.conv3(x)
    x = self.conv3_bn(x)
    # Outputs 1 x 196 x  4 x 4

    x = F.relu(x)
    x = F.max_pool2d(x, kernel_size=2, stride=2)
    # Outputs 1 x 196 x 2 x 2
    
    x = torch.flatten(x, start_dim=1)
    # Outputs: 1 x 784; Expected: 1 x 3136 = ( 196 x 4 x 4)

    x = self.fc1(x)
    x = self.fc1_bn(x)
    x = F.relu(x)

    return F.softmax(self.fc2(x), dim=1)

# Test code
random_data = torch.rand((1, 3, 32, 32))

my_nn = Net()
result = my_nn(random_data)
print (result)