As shown in the code we have two filters that we want to add to each layer but weren’t able to grasp how we add these filters. If you could show us a way to do so we would be very grateful.
Forgot to add the code aswell
def get_grad_kernel(channels):
Iy = [[1,-1]] #We want to implement these two filters
Ix = [[1],[-1]] #This part of code was also taken from another answer which we werent able to implement
return torch.Tensor([[Ix]*channels,[Iy]*channels])/4
class Net(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(3, 64,5,1,2)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(64, 128,5,1,2)
self.conv3 = nn.Conv2d(128,128,5,1,2)
self.conv4 = nn.Conv2d(128, 128,5,1,2)
self.conv5 = nn.Conv2d(128, 128,5,1,2)
self.fc1 = nn.Linear(128, 120)
self.fc2 = nn.Linear(120, 64)
self.fc3 = nn.Linear(64,32)
self.fc4 = nn.Linear(32,16)
self.fc5 = nn.Linear(16, 100)
weights1 = torch.tensor([[0,-1],])
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = self.pool(F.relu(self.conv3(x)))
x = self.pool(F.relu(self.conv4(x)))
x = self.pool(F.relu(self.conv5(x)))
x = torch.flatten(x, 1) # flatten all dimensions except batch
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = F.relu(self.fc3(x))
x = F.relu(self.fc4(x))
x = self.fc5(x)
return x
net = Net()
From some of the similar questions i did find that solution but when I tried to make it into a fixed filter I got the following errors
Heres the code
batch_size = 10
channels = 3
h, w = 24, 24
x = torch.randn(batch_size, channels, h, w)
# View approach
conv = nn.Conv2d(1, 1, 2, 2, bias=False)
with torch.no_grad():
conv.weight = nn.Parameter(torch.tensor([[[[1, -1],
[-1, 1]]]]))
output = conv(x.view(-1, 1, h, w)).view(batch_size, channels, h//2, w//2)
Error: Only Tensors of floating point and complex dtype can require gradients
When I write the values between 0 and 1 it works just fine.