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:
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.
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)