def __call__(self, x: TensorList): """ Compute residuals :param x: [filters, projection_matrices] :return: [data_terms, filter_regularizations, proj_mat_regularizations] """ filter = x[:len(x) // 2] # w2 in paper P = x[len(x) // 2:] # w1 in paper # Do first convolution compressed_samples = operation.conv1x1(self.training_samples, P).apply( self.projection_activation) # Do second convolution residuals = operation.conv2d(compressed_samples, filter, mode='same').apply( self.response_activation) # Compute data residuals residuals = residuals - self.y residuals = (self.sample_weights.sqrt().view(-1, 1, 1, 1)).variable() * residuals # Add regularization for projection matrix residuals.extend(self.filter_reg.apply(math.sqrt) * filter) # Add regularization for projection matrix residuals.extend(self.projection_reg.apply(math.sqrt) * P) return residuals
def ip_input(self, a: TensorList, b: TensorList): num = len(a) // 2 # Number of filters a_filter = a[:num] b_filter = b[:num] a_P = a[num:] b_P = b[num:] # Filter inner product # ip_out = a_filter.reshape(-1) @ b_filter.reshape(-1) ip_out = operation.conv2d(a_filter, b_filter).view(-1) # Add projection matrix part # ip_out += a_P.reshape(-1) @ b_P.reshape(-1) ip_out += operation.conv2d(a_P.view(1, -1, 1, 1), b_P.view(1, -1, 1, 1)).view(-1) # Have independent inner products for each filter return ip_out.concat(ip_out.clone())
def __call__(self, x: TensorList): """ Compute residuals :param x: [filters] :return: [data_terms, filter_regularizations] """ # Do convolution and compute residuals residuals = operation.conv2d(self.training_samples, x, mode='same').apply(self.response_activation) residuals = residuals - self.y residuals = self.sample_weights.sqrt().view(-1, 1, 1, 1).variable() * residuals # Add regularization for projection matrix residuals.extend(self.filter_reg.apply(math.sqrt) * x) return residuals
def ip_input(self, a: TensorList, b: TensorList): # return a.reshape(-1) @ b.reshape(-1) # return (a * b).sum() return operation.conv2d(a, b).view(-1)