'Learnable gaussian filter or bilateral filter for time series data

I implemented gaussian filter and bilateral filter for time series as below.

class BaseSpatialFilter():
    def __init__(self, win_size=3, padding="same", n_iter=1):
        assert win_size % 2 == 1, "window size must be odd value."
        assert padding in ("zero", "same", "identical"),\
            "padding method has to be `zero`, `same` or `identical`."

        self.win_size = win_size
        self.padder = get_padder(padding, {"padding_size": win_size // 2})
        self.med_idx = win_size // 2
        self.n_iter = n_iter

    def fit(self, seq):
        self.seq_ = seq  # keep original signal internal
        # padding
        self.seq_padded_ = self.padder.transform(seq)

        return self
    
    def transform(self, seq):
        for i in range(self.n_iter):
            x = self.seq_padded_
            # do filtering for each sub-sequence
            filt = []
            for xs in window(x, n=self.win_size):
                filt.append(self._filt(xs))
            x = np.hstack(filt)
            self.seq_padded_ = self.padder.transform(x)

        return x

    def fit_transform(self, seq):
        self.fit(seq)
        return self.transform(seq)

    @abc.abstractmethod
    def _filt(self, sub_seq):
        """Execute filtering for sub sequence.
        """
        pass

class GaussianFilter(BaseSpatialFilter):
    def __init__(self, win_size, padding="same", n_iter=1, sigma_d=None):
        super(GaussianFilter, self).__init__(win_size, padding, n_iter)
        if sigma_d is None:
            sigma_d = self._suggest_sigma_d()
        self.sigma_d = sigma_d
        self.weight = norm.pdf(np.arange(win_size), loc=self.med_idx, scale=self.sigma_d)
        self.weight /= self.weight.sum()

    def _filt(self, sub_seq):
        prod = self.weight.reshape(1, -1) @ sub_seq.reshape(-1, 1)
        return prod[0, 0]

class BilateralFilter(GaussianFilter):
    def __init__(self, win_size, padding="same", n_iter=100, sigma_d=None, sigma_i=None):
        super(BilateralFilter, self).__init__(win_size, padding, n_iter, sigma_d)
        self.sigma_i = sigma_i

    def _filt(self, sub_seq):
        if self.sigma_i is None:
            self.sigma_i = self._suggest_sigma_i()

        w = norm.pdf(sub_seq, loc=sub_seq[self.med_idx], scale=self.sigma_i)
        weight = self.weight * w
        weight /= weight.sum()

        prod = weight.reshape(1, -1) @ sub_seq.reshape(-1, 1)
        return prod[0, 0]

and I can apply this filter as below code

filt = GaussianFilter(WIN_SIZE, n_iter=iter_param, sigma_d=d_param)
filterd_y = filt.fit_transform(x).reshape((-1,1)) 

However, I want to make this parameters(sigma_d for gaussian, sigma_i for bilateral) learnable such as apply this kernel to Convlayer.

How can I do that?

Thx for reading my question.

ps. sorry for my poor English skills.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source