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!
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.
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With