Can you help me repair model?

Model specs:
RGB images

I build:

class Model(nn.Module):
    def __init__(self, num_classes=5):
        super(Model, self).__init__()
        self.conv1 = nn.Conv2d(3, 96, kernel_size=11, stride=4, padding=2)
        self.lu1 = nn.ReLU()
        self.pool2 = nn.MaxPool2d(kernel_size=3, stride=2)
        
        self.conv3 = nn.Conv2d(96, 192, kernel_size=5, padding=2, stride=1)
        self.lu3 = nn.ReLU()
        self.pool4 = nn.MaxPool2d(kernel_size=3, stride=2)
        
        self.conv5 = nn.Conv2d(192, 288, kernel_size=3, stride=1, padding=1)
        self.lu5 = nn.ReLU()
        
        self.conv6 = nn.Conv2d(288, 288, kernel_size=3, stride=1, padding=1)
        self.lu6 = nn.ReLU()
        
        self.conv7 = nn.Conv2d(288, 192, kernel_size=3, stride=1, padding=1)
        self.lu7 = nn.ReLU()        
        self.pool8 = nn.MaxPool2d(kernel_size=3, stride=2)        
        
        self.fc9 = nn.Linear(in_features=192, out_features=4096)
        self.fc10 = nn.Linear(in_features=4096, out_features=4096)
        self.fc11 = nn.Linear(in_features=4096, out_features=5)
        self.fc = nn.LogSoftmax()               

        
    def forward(self, input):
        output = self.conv1(input)
        output = self.lu1(output)
        output = self.pool2(output)
        
        output = self.conv2d(output)
        output = self.lu3(output)
        output = self.pool4(output)
        
        output = self.conv5(output)
        output = self.lu5(output)
        
        output = self.conv6(output)
        output = self.lu6(output)
        
        output = self.conv7(output)
        output = self.lu7(output)
        output = self.pool8(output)
        
        output = self.fc9(output)
        output = self.fc10(output)
        output = self.fc11(output)        
        output = self.fc(output)        
        return output

I’m newbie, i don’t know this is true/false? please help me. Thank you!

Hi,

Yes they look like the same thing.
Be careful on the loss you use: If you use CrossEntropyLoss it already contains the LogSoftmax and you will need to remove it from your model.

Thank @albanD
I have bug from layer 8 to layer 9. Layer 9: fully connected with 4096 neurons.

my code

    class Model(nn.Module):
    def __init__(self, num_classes=5):
        super(Model, self).__init__()
        
        #[256,256,3] (conv1)--> [63,63,96] (pool2)--> [31,31,96]
        self.conv1 = nn.Conv2d(3, 96, kernel_size=11, stride=4, padding=2)
        self.lu1 = nn.ReLU()
        self.pool2 = nn.MaxPool2d(kernel_size=3, stride=2)
        
        #[31,31,96] (conv3)--> [31,31,192] (pool4)-->[15,15,192]
        self.conv3 = nn.Conv2d(96, 192, kernel_size=5, padding=2, stride=1)
        self.lu3 = nn.ReLU()
        self.pool4 = nn.MaxPool2d(kernel_size=3, stride=2)
        
        #[15,15,192] (conv5) --> [15,15,288] 
        self.conv5 = nn.Conv2d(192, 288, kernel_size=3, stride=1, padding=1)
        self.lu5 = nn.ReLU()
        
        #[15,15,288] (conv6) --> [15,15,288]
        self.conv6 = nn.Conv2d(288, 288, kernel_size=3, stride=1, padding=1)
        self.lu6 = nn.ReLU()
        
        #[15,15,288] (conv7)--> [15,15,192] (pool8) --> [7,7,192]
        self.conv7 = nn.Conv2d(288, 192, kernel_size=3, stride=1, padding=1)
        self.lu7 = nn.ReLU()        
        self.pool8 = nn.MaxPool2d(kernel_size=3, stride=2)        
        
        # [7,7,192]
        self.fc9 = nn.Linear(in_features=192, out_features=4096)
        self.fc10 = nn.Linear(in_features=4096, out_features=4096)
        self.fc11 = nn.Linear(in_features=4096, out_features=5)
        
    def forward(self, input):
        output = self.conv1(input)
        output = self.lu1(output)
        output = self.pool2(output)
        
        output = self.conv3(output)
        output = self.lu3(output)
        output = self.pool4(output)
        
        output = self.conv5(output)
        output = self.lu5(output)
        
        output = self.conv6(output)
        output = self.lu6(output)
        
        output = self.conv7(output)
        output = self.lu7(output)
        output = self.pool8(output)
                
        output = self.fc9(output)
        output = self.fc10(output)
        output = self.fc11(output)        
        return output
        

epoch_nums = 60        
model = Model()

optimizer = Adam(model.parameters(), lr=5e-8, weight_decay=5e-1)     
loss_fn = nn.CrossEntropyLoss()

total_step = len(dataset_loader)

for epoch in range(epoch_nums):
    for i, (images, labels) in enumerate(dataset_loader):
        optimizer.zero_grad = 0
        outputs = model(images)
        loss = loss_fn(outputs, labels)
        loss.backward()
        optimizer.step()

The image sizes in your commend do not correspond to how they are stored in pytorch: The channel is before the size dimensions: batch_size x nb_channels x height x width.
Also I am not sure to understand what you want to do in the convolutional layers, I think you want the in_features for fc9 to be 192*7*7=9408. You can do that by adding a output = output.view(output.size(0), -1) in the forward pass and changing the in features when you declare it.

@albanD can detail where is code line put?

    output.view(output.size(0), -1) 
# Last convolutionnal layer return 4D output
output = self.pool8(output)

# Rephase to a 2D element to work with Linear layers
output = output.view(output.size(0), 7*7*192)

# Do Linear operations now
output = self.fc9(output)
1 Like

Many thank @albanD, this code line passed size bug.