Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to define specific number of convolutional kernels/filters in pytorch?

On pytorch website they have the following model in their tutorial

class BasicCNN(nn.Module):
    def __init__(self):
        super(BasicCNN, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = x.permute(0, 3, 1, 2)
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 16 * 5 * 5)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

How many kernels/filters this model has? Is it two - e.g conv1 and conv2. How do I easily create many filters by specifying the number of them? For example 100 filters.

Thanks!

like image 939
YohanRoth Avatar asked May 07 '19 21:05

YohanRoth


People also ask

How does CNN choose number of filters?

More than 0 and less than the number of parameters in each filter. For instance, if you have a 5x5 filter, 1 color channel (so, 5x5x1), then you should have less than 25 filters in that layer. The reason being is that if you have 25 or more filters, you have at least 1 filter per pixel.

How do you calculate convolution filter?

The recipe to calculate the convolution is: Mirror the function W in the origin to give function Wm[i,j]=W[−i,−j], then shift the weight function Wm to position (k,l) in the image, pixelwise multiply the function and shifted weight function and.

What is kernel and filter size in CNN?

Smaller kernel sizes consists of 1x1, 2x2, 3x3 and 4x4, whereas larger one consists of 5x5 and so on, but we use till 5x5 for 2D Convolution. In 2012, when AlexNet CNN architecture was introduced, it used 11x11, 5x5 like larger kernel sizes that consumed two to three weeks in training.


1 Answers

Your question is a little ambiguous but let me try to answer it.

Usually, in a convolutional layer, we set the number of filters as the number of out_channels. But this is not straight-forward. Let's discuss based on the example that you provided.

What are the convolutional layer parameters?

model = BasicCNN()
for name, params in model.named_parameters():
    if 'conv' in name:
        print(name, params.size())

Output:

conv1.weight torch.Size([6, 3, 5, 5])
conv1.bias torch.Size([6])
conv2.weight torch.Size([16, 6, 5, 5])
conv2.bias torch.Size([16])

Explanation

Let's consider conv1 layer in the above model. We can say, there are 6 filters of shape 5 x 5 because we have chosen 2d Convolution. Since the number of input channels is 3, so there are in total 6 x 3 = 18 kernels.

Here, the inputs of this model are 3d like images. You can consider, we have images with shape W x H and there are 3 channels (RGB) for images. So, we can feed 3d tensors representing images to this model.


Now coming back to your question, "How do I easily create many filters by specifying the number of them? For example 100 filters.". If you want to simply use 100 filters per input channel, then just set 100 in conv1 instead of 6. This is typically what people do in computer vision!

But you can definitely modify the architecture as per your need and identify the best setting.

like image 174
Wasi Ahmad Avatar answered Oct 26 '22 22:10

Wasi Ahmad