def __call__(self, *inputs):
        if not isinstance(self.interp, (tuple, list)):
            interp = [self.interp] * len(inputs)
        else:
            interp = self.interp

        outputs = []
        for idx, _input in enumerate(inputs):
            input_tf = th_affine2d(_input, self.tform_matrix, mode=interp[idx])
            outputs.append(input_tf)
        return outputs if idx > 1 else outputs[0]
    def __call__(self, *inputs):
        # collect all of the lazily returned tform matrices
        tform_matrix = self.transforms[0](inputs[0])
        for tform in self.transforms[1:]:
            tform_matrix = tform_matrix.mm(tform(inputs[0]))

        if not isinstance(self.interp, (tuple, list)):
            interp = [self.interp] * len(inputs)
        else:
            interp = self.interp

        outputs = []
        for idx, _input in enumerate(inputs):
            input_tf = th_affine2d(_input, tform_matrix, mode=interp[idx])
            outputs.append(input_tf)
        return outputs if idx > 1 else outputs[0]
    def __call__(self, *inputs):
        if not isinstance(self.interp, (tuple, list)):
            interp = [self.interp] * len(inputs)
        else:
            interp = self.interp

        zx, zy = self.value
        zoom_matrix = th.FloatTensor([[zx, 0, 0], [0, zy, 0], [0, 0, 1]])

        if self.lazy:
            return zoom_matrix
        else:
            outputs = []
            for idx, _input in enumerate(inputs):
                input_tf = th_affine2d(_input,
                                       zoom_matrix,
                                       mode=interp[idx],
                                       center=True)
                outputs.append(input_tf)
            return outputs if idx > 1 else outputs[0]
    def __call__(self, *inputs):
        if not isinstance(self.interp, (tuple, list)):
            interp = [self.interp] * len(inputs)
        else:
            interp = self.interp

        theta = (math.pi * self.value) / 180
        shear_matrix = th.FloatTensor([[1, -math.sin(theta), 0],
                                       [0, math.cos(theta), 0], [0, 0, 1]])
        if self.lazy:
            return shear_matrix
        else:
            outputs = []
            for idx, _input in enumerate(inputs):
                input_tf = th_affine2d(_input,
                                       shear_matrix,
                                       mode=interp[idx],
                                       center=True)
                outputs.append(input_tf)
            return outputs if idx > 1 else outputs[0]
    def __call__(self, *inputs):
        if not isinstance(self.interp, (tuple, list)):
            interp = [self.interp] * len(inputs)
        else:
            interp = self.interp

        tx = self.height_range * inputs[0].size(1)
        ty = self.width_range * inputs[0].size(2)

        translation_matrix = th.FloatTensor([[1, 0, tx], [0, 1, ty], [0, 0,
                                                                      1]])
        if self.lazy:
            return translation_matrix
        else:
            outputs = []
            for idx, _input in enumerate(inputs):
                input_tf = th_affine2d(_input,
                                       translation_matrix,
                                       mode=interp[idx],
                                       center=True)
                outputs.append(input_tf)
            return outputs if idx > 1 else outputs[0]