| import math |
| import torch |
| from .Module import Module |
| |
| |
| class TemporalConvolution(Module): |
| |
| def __init__(self, inputFrameSize, outputFrameSize, kW, dW=1): |
| super(TemporalConvolution, self).__init__() |
| |
| self.inputFrameSize = inputFrameSize |
| self.outputFrameSize = outputFrameSize |
| self.kW = kW |
| self.dW = dW |
| |
| self.weight = torch.Tensor(outputFrameSize, inputFrameSize * kW) |
| self.bias = torch.Tensor(outputFrameSize) |
| self.gradWeight = torch.Tensor(outputFrameSize, inputFrameSize * kW) |
| self.gradBias = torch.Tensor(outputFrameSize) |
| |
| self.reset() |
| |
| def reset(self, stdv=None): |
| if stdv is not None: |
| stdv = stdv * math.sqrt(3) |
| else: |
| stdv = 1. / math.sqrt(self.kW * self.inputFrameSize) |
| |
| self.weight.uniform_(-stdv, stdv) |
| self.bias.uniform_(-stdv, stdv) |
| |
| def updateOutput(self, input): |
| self._backend.TemporalConvolution_updateOutput( |
| self._backend.library_state, |
| input, |
| self.output, |
| self.weight, |
| self.bias, |
| self.kW, |
| self.dW, |
| self.inputFrameSize, |
| self.outputFrameSize |
| ) |
| return self.output |
| |
| def updateGradInput(self, input, gradOutput): |
| if self.gradInput is None: |
| return |
| self._backend.TemporalConvolution_updateGradInput( |
| self._backend.library_state, |
| input, |
| gradOutput, |
| self.gradInput, |
| self.weight, |
| self.kW, |
| self.dW |
| ) |
| return self.gradInput |
| |
| def accGradParameters(self, input, gradOutput, scale=1): |
| self._backend.TemporalConvolution_accGradParameters( |
| self._backend.library_state, |
| input, |
| gradOutput, |
| self.gradWeight, |
| self.gradBias, |
| self.kW, |
| self.dW, |
| scale |
| ) |