I am building a network that creates filters in a linear combination. But I don’t know if the approach is right. And it is also slow.
And I want to use the return value as weight.
How do you do it?
class Layer (torch.nn.Module):
    def __init __ (self, in_ch, out_ch):
        super (Layer, self) .__ init __ ()
        self.out_ch = out_ch
        self.in_ch = in_ch
        self.weights = torch.nn.Parameter (torch.Tensor (out_ch, in_ch, 5))

    def forward (self, x):
        w = torch.empty (self.out_ch, self.in_ch, 3, 3) .to ('cuda')

        for i in range (self.out_ch):
            for j in range (self.in_ch):
                w [i] [j] = x [0] .mul (self.weights [i] [j] [0]) + x [1] .mul (self.weights [i] [j] [1]) + x [2] .mul (self.weights [i] [j] [2]) \
                            + x [3] .mul (self.weights [i] [j] [3]) + x [4] .mul (self.weights [i] [j] [4])
        return w

class Net (nn.Module):
    def __init__(self):
       self.layer = Layer (3, 16)
       
    def forward (self, x):
        weight = self.layer(x) # x shape is (3, 3, 3)
        x = F.conv2d (x, weight)
        return x


Computation Speed ​​improvement
How to update parameters with parameters