I want to have a simple Siamese CNN which uses a “Shared weight” feature extractor. I have implemented the network like this:
class CnnSiamese(nn.Module): def __init__(self): super(CnnSiamese, self).__init__() self.feature_extractor = nn.Sequential(OrderedDict([ ('conv1', nn.Conv2d(in_channels=3, out_channels=10, kernel_size=3, padding=1)), ('maxpool1', nn.MaxPool2d(2)), ('relu1', nn.ReLU()), ('conv2', nn.Conv2d(in_channels=10, out_channels=20, kernel_size=3, padding=1)), ('maxpool2', nn.MaxPool2d(2)), ('relu2', nn.ReLU()), ('conv3', nn.Conv2d(in_channels=20, out_channels=30, kernel_size=3, padding=1)), ('dropout', nn.Dropout2d()), ('maxpool3', nn.MaxPool2d(2)), ('relu3', nn.ReLU()), ])) self.gap = nn.AdaptiveAvgPool2d((1, 1)) self.fc = nn.Linear(30, 2) def forward(self, x1, x2): x1 = self.feature_extractor(x1) x2 = self.feature_extractor(x2) x = torch.abs(x1 - x2) x = self.gap(x) x = x.view(x.shape, -1) x = self.fc(x) return x
The problem is that when I test the model with a single image and the copy of it as the input for the model, I expect that the output of
self.feature_extractor(x2) will be the same but I have got different tensors.
It seems that whenever I call
self.feature_extractor on an image, a new instance is created so if I call it twice on a single image, I got different tensors.
How Can I solve this pronlem?
Thanks in advance.