Python torch.nn.functional.unfold() Examples
The following are 30
code examples of torch.nn.functional.unfold().
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
You may also want to check out all available functions/classes of the module
torch.nn.functional
, or try the search function
.
Example #1
Source File: network.py From PiCANet-Implementation with MIT License | 6 votes |
def forward(self, *input): x = input[0] size = x.size() kernel = self.conv1(x) kernel = self.conv2(kernel) kernel = F.softmax(kernel, 1) kernel = kernel.reshape(size[0], 1, size[2] * size[3], 7 * 7) # print("Before unfold", x.shape) x = F.unfold(x, kernel_size=[7, 7], dilation=[2, 2], padding=6) # print("After unfold", x.shape) x = x.reshape(size[0], size[1], size[2] * size[3], -1) # print(x.shape, kernel.shape) x = torch.mul(x, kernel) x = torch.sum(x, dim=3) x = x.reshape(size[0], size[1], size[2], size[3]) return x
Example #2
Source File: siammask.py From SiamMask with MIT License | 6 votes |
def select_mask_logistic_loss(p_m, mask, weight, o_sz=63, g_sz=127): weight = weight.view(-1) pos = Variable(weight.data.eq(1).nonzero().squeeze()) if pos.nelement() == 0: return p_m.sum() * 0, p_m.sum() * 0, p_m.sum() * 0, p_m.sum() * 0 p_m = p_m.permute(0, 2, 3, 1).contiguous().view(-1, 1, o_sz, o_sz) p_m = torch.index_select(p_m, 0, pos) p_m = nn.UpsamplingBilinear2d(size=[g_sz, g_sz])(p_m) p_m = p_m.view(-1, g_sz * g_sz) mask_uf = F.unfold(mask, (g_sz, g_sz), padding=32, stride=8) mask_uf = torch.transpose(mask_uf, 1, 2).contiguous().view(-1, g_sz * g_sz) mask_uf = torch.index_select(mask_uf, 0, pos) loss = F.soft_margin_loss(p_m, mask_uf) iou_m, iou_5, iou_7 = iou_measure(p_m, mask_uf) return loss, iou_m, iou_5, iou_7
Example #3
Source File: siammask_sharp.py From SiamMask with MIT License | 6 votes |
def select_mask_logistic_loss(p_m, mask, weight, o_sz=63, g_sz=127): weight = weight.view(-1) pos = Variable(weight.data.eq(1).nonzero().squeeze()) if pos.nelement() == 0: return p_m.sum() * 0, p_m.sum() * 0, p_m.sum() * 0, p_m.sum() * 0 if len(p_m.shape) == 4: p_m = p_m.permute(0, 2, 3, 1).contiguous().view(-1, 1, o_sz, o_sz) p_m = torch.index_select(p_m, 0, pos) p_m = nn.UpsamplingBilinear2d(size=[g_sz, g_sz])(p_m) p_m = p_m.view(-1, g_sz * g_sz) else: p_m = torch.index_select(p_m, 0, pos) mask_uf = F.unfold(mask, (g_sz, g_sz), padding=0, stride=8) mask_uf = torch.transpose(mask_uf, 1, 2).contiguous().view(-1, g_sz * g_sz) mask_uf = torch.index_select(mask_uf, 0, pos) loss = F.soft_margin_loss(p_m, mask_uf) iou_m, iou_5, iou_7 = iou_measure(p_m, mask_uf) return loss, iou_m, iou_5, iou_7
Example #4
Source File: custom.py From SiamMask with MIT License | 6 votes |
def forward(self, f, corr_feature, pos=None, test=False): if test: p0 = torch.nn.functional.pad(f[0], [16, 16, 16, 16])[:, :, 4*pos[0]:4*pos[0]+61, 4*pos[1]:4*pos[1]+61] p1 = torch.nn.functional.pad(f[1], [8, 8, 8, 8])[:, :, 2 * pos[0]:2 * pos[0] + 31, 2 * pos[1]:2 * pos[1] + 31] p2 = torch.nn.functional.pad(f[2], [4, 4, 4, 4])[:, :, pos[0]:pos[0] + 15, pos[1]:pos[1] + 15] else: p0 = F.unfold(f[0], (61, 61), padding=0, stride=4).permute(0, 2, 1).contiguous().view(-1, 64, 61, 61) if not (pos is None): p0 = torch.index_select(p0, 0, pos) p1 = F.unfold(f[1], (31, 31), padding=0, stride=2).permute(0, 2, 1).contiguous().view(-1, 256, 31, 31) if not (pos is None): p1 = torch.index_select(p1, 0, pos) p2 = F.unfold(f[2], (15, 15), padding=0, stride=1).permute(0, 2, 1).contiguous().view(-1, 512, 15, 15) if not (pos is None): p2 = torch.index_select(p2, 0, pos) if not(pos is None): p3 = corr_feature[:, :, pos[0], pos[1]].view(-1, 256, 1, 1) else: p3 = corr_feature.permute(0, 2, 3, 1).contiguous().view(-1, 256, 1, 1) out = self.deconv(p3) out = self.post0(F.upsample(self.h2(out) + self.v2(p2), size=(31, 31))) out = self.post1(F.upsample(self.h1(out) + self.v1(p1), size=(61, 61))) out = self.post2(F.upsample(self.h0(out) + self.v0(p0), size=(127, 127))) out = out.view(-1, 127*127) return out
Example #5
Source File: connection.py From PySNN with MIT License | 6 votes |
def forward(self, x, trace_in): r"""Calculate postsynaptic activation potentials and trace. :param x: Presynaptic spikes. :param trace_in: Presynaptic trace. :return: (Activation potentials, Postsynaptic trace) """ trace_in = self.unfold(trace_in) self.update_trace(trace_in) x = self.convert_spikes(x) x = self.unfold(x) # Till here it is a rather easy set of steps x = self.propagate_spike(x) # Output spikes return self.activation_potential(x), self.fold(self.trace) ######################################################### # Max Pooling #########################################################
Example #6
Source File: utils.py From bindsnet with GNU Affero General Public License v3.0 | 6 votes |
def im2col_indices( x: Tensor, kernel_height: int, kernel_width: int, padding: Tuple[int, int] = (0, 0), stride: Tuple[int, int] = (1, 1), ) -> Tensor: # language=rst """ im2col is a special case of unfold which is implemented inside of Pytorch. :param x: Input image tensor to be reshaped to column-wise format. :param kernel_height: Height of the convolutional kernel in pixels. :param kernel_width: Width of the convolutional kernel in pixels. :param padding: Amount of zero padding on the input image. :param stride: Amount to stride over image by per convolution. :return: Input tensor reshaped to column-wise format. """ return F.unfold( x, (kernel_height, kernel_width), padding=padding, stride=stride )
Example #7
Source File: train_interface.py From sanet_relocal_demo with GNU General Public License v3.0 | 6 votes |
def feature_region_reg_loss(gt_f_pairs): inp = np.zeros((15, 15), dtype=np.float32) inp[7, 7] = 1 gaussian_kernel = fi.gaussian_filter(inp, 3.5) target = torch.cuda.FloatTensor(gaussian_kernel).view(1, 15 * 15, 1) target = (1.0 - target / target.max()) * 2.0 loss = 0.0 for (f_a, gt_f_wrap_b) in gt_f_pairs: N, C, H, W = f_a.shape unfold_gt_f_wrap_b = F.unfold(gt_f_wrap_b, kernel_size=15, padding=7, stride=4).view(N, C, 15 * 15, H * W // 16) # (N, C, 15*15, num_patches) unfold_f_a = F.unfold(f_a, kernel_size=1, padding=0, stride=4).view(N, C, 1, H * W // 16) # (N, C, 1, num_patches) e = torch.norm(unfold_f_a - unfold_gt_f_wrap_b, p=2, dim=1) # (N, 15*15, num_patches) meann = torch.mean(e, 1, keepdim=True) e = e / meann loss += torch.mean((target - e) ** 2) return loss
Example #8
Source File: samplegrad.py From pytorch-sso with MIT License | 6 votes |
def grad_conv2d(module: nn.Module, data_input: torch.Tensor, grad_output: torch.Tensor): assert isinstance(module, nn.Conv2d) conv2d = module assert data_input.ndimension() == 4 # n x c_in x h_in x w_in assert grad_output.ndimension() == 4 # n x c_out x h_out x w_out if conv2d.weight.requires_grad: # n x (c_in)(k_h)(k_w) x (h_out)(w_out) input2d = F.unfold(data_input, kernel_size=conv2d.kernel_size, stride=conv2d.stride, padding=conv2d.padding, dilation=conv2d.dilation) # n x c_out x h_out x w_out n, c_out, h, w = grad_output.size() # n x c_out x (h_out)(w_out) grad_output2d = grad_output.view(n, c_out, -1) c_out, c_in, k_h, k_w = conv2d.weight.size() grads_2d = torch.einsum('bik,bjk->bij', grad_output2d, input2d) # n x c_out x (c_in)(k_h)(k_w) setattr(conv2d.weight, 'grads', grads_2d.view(n, c_out, c_in, k_h, k_w)) # n x c_out x c_in x k_h x k_w if hasattr(conv2d, 'bias') and conv2d.bias.requires_grad: setattr(conv2d.bias, 'grads', grad_output.sum(dim=(2, 3))) # n x c_out
Example #9
Source File: network4att_test.py From PiCANet-Implementation with MIT License | 6 votes |
def forward(self, *input): x = input[0] size = x.size() kernel = self.renet(x) kernel = F.softmax(kernel, 1) # print(kernel.size()) x = F.unfold(x, [10, 10], dilation=[3, 3]) x = x.reshape(size[0], size[1], 10 * 10) kernel = kernel.reshape(size[0], 100, -1) x = torch.matmul(x, kernel) x = x.reshape(size[0], size[1], size[2], size[3]) # for attention visualization # print(torch.cuda.memory_allocated() / 1024 / 1024) attention = kernel.data attention = attention.requires_grad_(False) attention = torch.reshape(attention, (size[0], -1, 10, 10)) # attention = F.conv_transpose2d(torch.ones((1, 1, 1, 1)).cuda(), attention, dilation=3) attention = F.interpolate(attention, 224, mode='bilinear', align_corners=True) # attention = F.interpolate(attention, 224, mode='area') attention = torch.reshape(attention, (size[0], size[2], size[3], 224, 224)) return x, attention
Example #10
Source File: utils.py From bindsnet with GNU Affero General Public License v3.0 | 6 votes |
def im2col_indices( x: Tensor, kernel_height: int, kernel_width: int, padding: Tuple[int, int] = (0, 0), stride: Tuple[int, int] = (1, 1), ) -> Tensor: # language=rst """ im2col is a special case of unfold which is implemented inside of Pytorch. :param x: Input image tensor to be reshaped to column-wise format. :param kernel_height: Height of the convolutional kernel in pixels. :param kernel_width: Width of the convolutional kernel in pixels. :param padding: Amount of zero padding on the input image. :param stride: Amount to stride over image by per convolution. :return: Input tensor reshaped to column-wise format. """ return F.unfold(x, (kernel_height, kernel_width), padding=padding, stride=stride)
Example #11
Source File: conv.py From pytorch-sso with MIT License | 6 votes |
def update_in_forward(self, data_input): conv2d = self._module # n x (c_in)(k_h)(k_w) x (h_out)(w_out) input2d = F.unfold(data_input, kernel_size=conv2d.kernel_size, stride=conv2d.stride, padding=conv2d.padding, dilation=conv2d.dilation) n, a, _ = input2d.shape # (c_in)(k_h)(k_w) x n(h_out)(w_out) m = input2d.transpose(0, 1).reshape(a, -1) a, b = m.shape if self.bias: # {(c_in)(k_h)(k_w) + 1} x n(h_out)(w_out) m = torch.cat((m, m.new_ones((1, b))), 0) # (c_in)(k_h)(k_w) x (c_in)(k_h)(k_w) or # {(c_in)(k_h)(k_w) + 1} x {(c_in)(k_h)(k_w) + 1} A = torch.einsum('ik,jk->ij', m, m).div(n) self._A = A
Example #12
Source File: pac.py From openseg.pytorch with MIT License | 6 votes |
def backward(ctx, grad_output): input, kernel = ctx.saved_tensors grad_input = grad_kernel = None (bs, ch), out_sz = grad_output.shape[:2], grad_output.shape[2:] if ctx.needs_input_grad[0]: grad_input = grad_output.new() grad_im2col_output = torch.einsum('ijmn,izklmn->ijklmn', (grad_output, kernel)) grad_im2col_output = grad_im2col_output.view(bs, -1, out_sz[0] * out_sz[1]) ctx._backend.Im2Col_updateGradInput(ctx._backend.library_state, grad_im2col_output, grad_input, ctx.input_size[0], ctx.input_size[1], ctx.kernel_size[0], ctx.kernel_size[1], ctx.dilation[0], ctx.dilation[1], ctx.padding[0], ctx.padding[1], ctx.stride[0], ctx.stride[1]) if ctx.needs_input_grad[1]: cols = F.unfold(input, ctx.kernel_size, ctx.dilation, ctx.padding, ctx.stride) cols = cols.view(bs, ch, ctx.kernel_size[0], ctx.kernel_size[1], out_sz[0], out_sz[1]) grad_kernel = torch.einsum('ijmn,ijklmn->ijklmn', (grad_output, cols)) if ctx.kernel_ch == 1: grad_kernel = grad_kernel.sum(dim=1, keepdim=True) return grad_input, grad_kernel, None, None, None, None
Example #13
Source File: pac.py From openseg.pytorch with MIT License | 6 votes |
def forward(ctx, input, kernel, kernel_size, stride=1, padding=0, dilation=1): (bs, ch), in_sz = input.shape[:2], input.shape[2:] if kernel.size(1) > 1 and kernel.size(1) != ch: raise ValueError('Incompatible input and kernel sizes.') ctx.input_size = in_sz ctx.kernel_size = _pair(kernel_size) ctx.kernel_ch = kernel.size(1) ctx.dilation = _pair(dilation) ctx.padding = _pair(padding) ctx.stride = _pair(stride) ctx.save_for_backward(input if ctx.needs_input_grad[1] else None, kernel if ctx.needs_input_grad[0] else None) ctx._backend = type2backend[input.type()] cols = F.unfold(input, ctx.kernel_size, ctx.dilation, ctx.padding, ctx.stride) output = cols.view(bs, ch, *kernel.shape[2:]) * kernel output = torch.einsum('ijklmn->ijmn', (output,)) return output.clone() # TODO check whether a .clone() is needed here
Example #14
Source File: pac.py From openseg.pytorch with MIT License | 6 votes |
def backward(ctx, grad_output): input, output = ctx.saved_tensors bs, ch, in_h, in_w = input.shape out_h, out_w = output.shape[-2:] cols = F.unfold(input, ctx.kernel_size, ctx.dilation, ctx.padding, ctx.stride) cols = cols.view(bs, ch, ctx.kernel_size[0], ctx.kernel_size[1], out_h, out_w) center_y, center_x = ctx.kernel_size[0] // 2, ctx.kernel_size[1] // 2 feat_0 = cols.contiguous()[:, :, center_y:center_y + 1, center_x:center_x + 1, :, :] diff = cols - feat_0 grad = -0.5 * grad_output * output grad_diff = grad.expand_as(cols) * (2 * diff) grad_diff[:, :, center_y:center_y + 1, center_x:center_x + 1, :, :] -= \ grad_diff.sum(dim=2, keepdim=True).sum(dim=3, keepdim=True) grad_input = grad_output.new() ctx._backend.Im2Col_updateGradInput(ctx._backend.library_state, grad_diff.view(bs, ch * ctx.kernel_size[0] * ctx.kernel_size[1], -1), grad_input, in_h, in_w, ctx.kernel_size[0], ctx.kernel_size[1], ctx.dilation[0], ctx.dilation[1], ctx.padding[0], ctx.padding[1], ctx.stride[0], ctx.stride[1]) return grad_input, None, None, None, None, None
Example #15
Source File: pac.py From openseg.pytorch with MIT License | 6 votes |
def forward(ctx, input, kernel_size, stride, padding, dilation, channel_wise): ctx.kernel_size = _pair(kernel_size) ctx.dilation = _pair(dilation) ctx.padding = _pair(padding) ctx.stride = _pair(stride) bs, ch, in_h, in_w = input.shape out_h = (in_h + 2 * ctx.padding[0] - ctx.dilation[0] * (ctx.kernel_size[0] - 1) - 1) // ctx.stride[0] + 1 out_w = (in_w + 2 * ctx.padding[1] - ctx.dilation[1] * (ctx.kernel_size[1] - 1) - 1) // ctx.stride[1] + 1 cols = F.unfold(input, ctx.kernel_size, ctx.dilation, ctx.padding, ctx.stride) cols = cols.view(bs, ch, ctx.kernel_size[0], ctx.kernel_size[1], out_h, out_w) center_y, center_x = ctx.kernel_size[0] // 2, ctx.kernel_size[1] // 2 feat_0 = cols.contiguous()[:, :, center_y:center_y + 1, center_x:center_x + 1, :, :] diff_sq = (cols - feat_0).pow(2) if not channel_wise: diff_sq = diff_sq.sum(dim=1, keepdim=True) output = torch.exp(-0.5 * diff_sq) ctx._backend = type2backend[input.type()] ctx.save_for_backward(input, output) return output
Example #16
Source File: conv.py From pytorch-sso with MIT License | 5 votes |
def update_in_backward(self, grad_output): conv2d = self._module data_input = getattr(conv2d, 'data_input', None) # n x c_in x h_in x w_in assert data_input is not None # n x (c_in)(k_h)(k_w) x (h_out)(w_out) input2d = F.unfold(data_input, kernel_size=conv2d.kernel_size, stride=conv2d.stride, padding=conv2d.padding, dilation=conv2d.dilation) # n x c_out x h_out x w_out n, c_out, h, w = grad_output.shape # n x c_out x (h_out)(w_out) grad_output2d = grad_output.reshape(n, c_out, -1) grad_in = torch.einsum('bik,bjk->bij', grad_output2d, input2d) # n x c_out x (c_in)(k_h)(k_w) data_w = grad_in.mul(grad_in).mean(dim=0) # c_out x (c_in)(k_h)(k_w) data_w = data_w.reshape((c_out, -1, *conv2d.kernel_size)) # c_out x c_in x k_h x k_w self._data = [data_w] if self.bias: grad_grad = grad_output2d.mul(grad_output2d) # n x c_out x (h_out)(w_out) data_b = grad_grad.sum(dim=2).mean(dim=0) # c_out self._data.append(data_b)
Example #17
Source File: recurrent.py From asteroid with MIT License | 5 votes |
def forward(self, mixture_w): """ Args: mixture_w (:class:`torch.Tensor`): Tensor of shape [batch, n_filters, n_frames] Returns: :class:`torch.Tensor` estimated mask of shape [batch, n_src, n_filters, n_frames] """ batch, n_filters, n_frames = mixture_w.size() output = self.bottleneck(mixture_w) # [batch, bn_chan, n_frames] output = unfold(output.unsqueeze(-1), kernel_size=(self.chunk_size, 1), padding=(self.chunk_size, 0), stride=(self.hop_size, 1)) n_chunks = output.size(-1) output = output.reshape(batch, self.bn_chan, self.chunk_size, n_chunks) # Apply stacked DPRNN Blocks sequentially output = self.net(output) # Map to sources with kind of 2D masks output = self.first_out(output) output = output.reshape(batch * self.n_src, self.bn_chan, self.chunk_size, n_chunks) # Overlap and add: # [batch, out_chan, chunk_size, n_chunks] -> [batch, out_chan, n_frames] to_unfold = self.bn_chan * self.chunk_size output = fold(output.reshape(batch * self.n_src, to_unfold, n_chunks), (n_frames, 1), kernel_size=(self.chunk_size, 1), padding=(self.chunk_size, 0), stride=(self.hop_size, 1)) # Apply gating output = output.reshape(batch * self.n_src, self.bn_chan, -1) output = self.net_out(output) * self.net_gate(output) # Compute mask score = self.mask_net(output) est_mask = self.output_act(score) est_mask = est_mask.view(batch, self.n_src, self.out_chan, n_frames) return est_mask
Example #18
Source File: test_pyprof_nvtx.py From apex with BSD 3-Clause "New" or "Revised" License | 5 votes |
def test_unfold(self): inp = torch.randn(1, 3, 32, 32, device='cuda', dtype=self.dtype) kernel_size = (4, 5) inp_unf_dilated = F.unfold(inp, kernel_size, dilation=2) inp_unf_padded = F.unfold(inp, kernel_size, padding=2) inp_unf_strided = F.unfold(inp, kernel_size, stride=2)
Example #19
Source File: point_feat.py From sanet_relocal_demo with GNU General Public License v3.0 | 5 votes |
def valid_avg_pool(tensor, valid_mask, kernel_size): valid_mask = valid_mask.float() N, C, H, W = tensor.shape out_H = H // kernel_size out_W = W // kernel_size tensor_patch = F.unfold( tensor, kernel_size=kernel_size, stride=kernel_size ).view(N, C, -1, out_H, out_W) valid_mask_patch = F.unfold( valid_mask, kernel_size=kernel_size, stride=kernel_size ).view(N, C, -1, out_H, out_W) count = torch.sum(valid_mask_patch.float(), dim=2) pooled_tensor = torch.sum(tensor_patch * valid_mask_patch.float(), dim=2) / \ torch.where(torch.le(count, 1e-5), torch.full(count.shape, 1e6).to(tensor.device), count) # (N, 3, out_H, out_W) pooled_mask = torch.gt(count, 1e-3) return pooled_tensor, pooled_mask[:, 0, :, :]
Example #20
Source File: conv.py From pytorch-sso with MIT License | 5 votes |
def update_in_backward(self, grad_output): if self.do_backward: assert self.prob is not None conv2d = self._module data_input = getattr(conv2d, 'data_input', None) # n x c_in x h_in x w_in assert data_input is not None # n x (c_in)(k_h)(k_w) x (h_out)(w_out) input2d = F.unfold(data_input, kernel_size=conv2d.kernel_size, stride=conv2d.stride, padding=conv2d.padding, dilation=conv2d.dilation) # n x c_out x h_out x w_out n, c_out, h, w = grad_output.shape # n x c_out x (h_out)(w_out) grad_output2d = grad_output.reshape(n, c_out, -1) grad_in = torch.einsum('bik,bjk->bij', grad_output2d, input2d) # n x c_out x (c_in)(k_h)(k_w) pgi = torch.mul(grad_in, self.prob.reshape(n, 1, 1)) data_w = pgi.mul(grad_in).mean(dim=0) # c_out x (c_in)(k_h)(k_w) data_w = data_w.reshape((c_out, -1, *conv2d.kernel_size)) # c_out x c_in x k_h x k_w self._data = [data_w] if self.bias: pg = torch.mul(grad_output2d, self.prob.reshape(n, 1, 1)) grad_grad = pg.mul(grad_output2d) # n x c_out x (h_out)(w_out) data_b = grad_grad.sum(dim=2).mean(dim=0) # c_out self._data.append(data_b) self.accumulate_cov(self._data) else: self._data = self.finalize()
Example #21
Source File: kfac.py From EKFAC-pytorch with MIT License | 5 votes |
def _compute_covs(self, group, state): """Computes the covariances.""" mod = group['mod'] x = self.state[group['mod']]['x'] gy = self.state[group['mod']]['gy'] # Computation of xxt if group['layer_type'] == 'Conv2d': if not self.sua: x = F.unfold(x, mod.kernel_size, padding=mod.padding, stride=mod.stride) else: x = x.view(x.shape[0], x.shape[1], -1) x = x.data.permute(1, 0, 2).contiguous().view(x.shape[1], -1) else: x = x.data.t() if mod.bias is not None: ones = torch.ones_like(x[:1]) x = torch.cat([x, ones], dim=0) if self._iteration_counter == 0: state['xxt'] = torch.mm(x, x.t()) / float(x.shape[1]) else: state['xxt'].addmm_(mat1=x, mat2=x.t(), beta=(1. - self.alpha), alpha=self.alpha / float(x.shape[1])) # Computation of ggt if group['layer_type'] == 'Conv2d': gy = gy.data.permute(1, 0, 2, 3) state['num_locations'] = gy.shape[2] * gy.shape[3] gy = gy.contiguous().view(gy.shape[0], -1) else: gy = gy.data.t() state['num_locations'] = 1 if self._iteration_counter == 0: state['ggt'] = torch.mm(gy, gy.t()) / float(gy.shape[1]) else: state['ggt'].addmm_(mat1=gy, mat2=gy.t(), beta=(1. - self.alpha), alpha=self.alpha / float(gy.shape[1]))
Example #22
Source File: tools.py From GMIC with GNU Affero General Public License v3.0 | 5 votes |
def get_max_window(input_image, window_shape, pooling_logic="avg"): """ Function that makes a sliding window of size window_shape over the input_image and return the UPPER_LEFT corner index with max sum :param input_image: N*C*H*W :param window_shape: h*w :return: N*C*2 tensor """ N, C, H, W = input_image.size() if pooling_logic == "avg": # use average pooling to locate the window sums pool_map = torch.nn.functional.avg_pool2d(input_image, window_shape, stride=1) elif pooling_logic in ["std", "avg_entropy"]: # create sliding windows output_size = (H - window_shape[0] + 1, W - window_shape[1] + 1) sliding_windows = F.unfold(input_image, kernel_size=window_shape).view(N,C, window_shape[0]*window_shape[1], -1) # apply aggregation function on each sliding windows if pooling_logic == "std": agg_res = sliding_windows.std(dim=2, keepdim=False) elif pooling_logic == "avg_entropy": agg_res = -sliding_windows*torch.log(sliding_windows)-(1-sliding_windows)*torch.log(1-sliding_windows) agg_res = agg_res.mean(dim=2, keepdim=False) # merge back pool_map = F.fold(agg_res, kernel_size=(1, 1), output_size=output_size) _, _, _, W_map = pool_map.size() # transform to linear and get the index of the max val locations _, max_linear_idx = torch.max(pool_map.view(N, C, -1), -1) # convert back to 2d index max_idx_x = max_linear_idx / W_map max_idx_y = max_linear_idx - max_idx_x * W_map # put together the 2d index upper_left_points = torch.cat([max_idx_x.unsqueeze(-1), max_idx_y.unsqueeze(-1)], dim=-1) return upper_left_points
Example #23
Source File: pac.py From openseg.pytorch with MIT License | 5 votes |
def nd2col(input_nd, kernel_size, stride=1, padding=0, output_padding=0, dilation=1, transposed=False, use_pyinn_if_possible=False): """ Shape: - Input: :math:`(N, C, L_{in})` - Output: :math:`(N, C, *kernel_size, *L_{out})` where :math:`L_{out} = floor((L_{in} + 2 * padding - dilation * (kernel_size - 1) - 1) / stride + 1)` for non-transposed :math:`L_{out} = (L_{in} - 1) * stride - 2 * padding + dilation * (kernel_size - 1) + 1 + output_padding` for transposed """ n_dims = len(input_nd.shape[2:]) kernel_size = (kernel_size,) * n_dims if isinstance(kernel_size, Number) else kernel_size stride = (stride,) * n_dims if isinstance(stride, Number) else stride padding = (padding,) * n_dims if isinstance(padding, Number) else padding output_padding = (output_padding,) * n_dims if isinstance(output_padding, Number) else output_padding dilation = (dilation,) * n_dims if isinstance(dilation, Number) else dilation if transposed: assert n_dims == 2, 'Only 2D is supported for fractional strides.' w_one = input_nd.new_ones(1, 1, 1, 1) pad = [(k - 1) * d - p for (k, d, p) in zip(kernel_size, dilation, padding)] input_nd = F.conv_transpose2d(input_nd, w_one, stride=stride) input_nd = F.pad(input_nd, (pad[1], pad[1] + output_padding[1], pad[0], pad[0] + output_padding[0])) stride = _pair(1) padding = _pair(0) (bs, nch), in_sz = input_nd.shape[:2], input_nd.shape[2:] out_sz = tuple([((i + 2 * p - d * (k - 1) - 1) // s + 1) for (i, k, d, p, s) in zip(in_sz, kernel_size, dilation, padding, stride)]) # Use PyINN if possible (about 15% faster) TODO confirm the speed-up if n_dims == 2 and dilation == 1 and has_pyinn and torch.cuda.is_available() and use_pyinn_if_possible: output = P.im2col(input_nd, kernel_size, stride, padding) else: output = F.unfold(input_nd, kernel_size, dilation, padding, stride) out_shape = (bs, nch) + tuple(kernel_size) + out_sz output = output.view(*out_shape).contiguous() return output
Example #24
Source File: functional.py From Holocron with MIT License | 5 votes |
def _xcorrNd(fn, x, weight, bias=None, stride=1, padding=0, dilation=1, groups=1, normalize_slices=False, eps=1e-14): """Implements cross-correlation operation""" # Reshape input Tensor into properly sized slices h, w = x.shape[-2:] x = F.unfold(x, weight.shape[-2:], dilation=dilation, padding=padding, stride=stride) x = x.transpose(1, 2) # Normalize the slices if normalize_slices: unfold_scale = (x.var(-1, unbiased=False, keepdim=True) + eps).rsqrt() x -= x.mean(-1, keepdim=True) x *= unfold_scale.expand_as(x) # Perform common convolutions x = fn(x, weight) if bias is not None: x += bias x = x.transpose(1, 2) # Check output shape if isinstance(padding, int): padding = (padding, padding) if isinstance(stride, int): stride = (stride, stride) h = floor((h + (2 * padding[0]) - (dilation[0] * (weight.shape[-2] - 1)) - 1) / stride[0] + 1) w = floor((w + (2 * padding[1]) - (dilation[1] * (weight.shape[-1] - 1)) - 1) / stride[1] + 1) x = x.view(-1, weight.shape[0], h, w) return x
Example #25
Source File: connection.py From PySNN with MIT License | 5 votes |
def unfold(self, x): r"""Simply unfolds incoming image according to layer parameters. Currently torch.nn.functional.unfold only support 4D tenors (BxCxHxW)! """ # TODO: Possibly implement own folding function that supports 5D if needed return F.unfold( x, self.kernel_size, self.dilation, self.padding, self.stride ).unsqueeze(1)
Example #26
Source File: connection.py From PySNN with MIT License | 5 votes |
def unfold(self, x): r"""Placeholder for possible folding functionality.""" return x
Example #27
Source File: models.py From DKN with GNU General Public License v3.0 | 5 votes |
def forward(self, x): image, depth = x weight, offset = self._shift_and_stitch(x) h, w = image.size(2), image.size(3) b = image.size(0) k = self.filter_size r = self.kernel_size hw = h*w # weighted average # (b, 2*r**2, h, w) -> (b*hw, r, r, 2) offset = offset.permute(0,2,3,1).contiguous().view(b*hw, r,r, 2) # (b, r**2, h, w) -> (b*hw, r**2, 1) weight = weight.permute(0,2,3,1).contiguous().view(b*hw, r*r, 1) # (b*hw, r, r, 2) grid = grid_generator(k, r, b*hw) coord = grid + offset coord = (coord / k * 2) -1 # (b, k**2, hw) -> (b*hw, 1, k, k) depth_col = F.unfold(depth, k, padding=k//2).permute(0,2,1).contiguous().view(b*hw, 1, k,k) # (b*hw, 1, k, k), (b*hw, r, r, 2) => (b*hw, 1, r^2) depth_sampled = F.grid_sample(depth_col, coord).view(b*hw, 1, -1) # (b*w*h, 1, r^2) x (b*w*h, r^2, 1) => (b, 1, h,w) out = torch.bmm(depth_sampled, weight).view(b, 1, h,w) if self.residual: out += depth return out
Example #28
Source File: network4att_test.py From PiCANet-Implementation with MIT License | 5 votes |
def forward(self, *input): x = input[0] size = x.size() kernel = self.conv1(x) kernel = self.conv2(kernel) kernel = F.softmax(kernel, 1) attention = kernel.data kernel = kernel.reshape(size[0], 1, size[2] * size[3], 7 * 7) # print("Before unfold", x.shape) x = F.unfold(x, kernel_size=[7, 7], dilation=[2, 2], padding=6) # print("After unfold", x.shape) x = x.reshape(size[0], size[1], size[2] * size[3], -1) # print(x.shape, kernel.shape) x = torch.mul(x, kernel) x = torch.sum(x, dim=3) x = x.reshape(size[0], size[1], size[2], size[3]) # attention = kernel.data attention = attention.requires_grad_(False) # attention = torch.reshape(attention, (size[0], -1, 7, 7)) attention = torch.reshape(attention, (size[0], -1, 7, 7)) # attention = F.conv_transpose2d(torch.ones((1, 1, 1, 1)).cuda(), attention, dilation=2) attention = F.interpolate(attention, int(12 * 224 / size[2] + 1), mode='bilinear', align_corners=True) # attention = F.interpolate(attention, int(12 * 224 / size[2] + 1), mode='area') attention = torch.reshape(attention, (size[0], size[2], size[3], int(12 * 224 / size[2] + 1), int(12 * 224 / size[2] + 1))) # attention = attention.permute(0, 2, 1, 3, 4) # attention = attention.permute(0, 1, 2, 4, 3) return x, attention
Example #29
Source File: network.py From PiCANet-Implementation with MIT License | 5 votes |
def forward(self, *input): x = input[0] size = x.size() kernel = self.renet(x) kernel = F.softmax(kernel, 1) x = F.unfold(x, [10, 10], dilation=[3, 3]) x = x.reshape(size[0], size[1], 10 * 10) kernel = kernel.reshape(size[0], 100, -1) x = torch.matmul(x, kernel) x = x.reshape(size[0], size[1], size[2], size[3]) return x
Example #30
Source File: star_transformer.py From fastNLP with Apache License 2.0 | 5 votes |
def forward(self, x, ax=None): # x: B, H, L, 1, ax : B, H, X, L append features nhid, nhead, head_dim, unfold_size = self.nhid, self.nhead, self.head_dim, self.unfold_size B, H, L, _ = x.shape q, k, v = self.WQ(x), self.WK(x), self.WV(x) # x: (B,H,L,1) if ax is not None: aL = ax.shape[2] ak = self.WK(ax).view(B, nhead, head_dim, aL, L) av = self.WV(ax).view(B, nhead, head_dim, aL, L) q = q.view(B, nhead, head_dim, 1, L) k = F.unfold(k.view(B, nhead * head_dim, L, 1), (unfold_size, 1), padding=(unfold_size // 2, 0)) \ .view(B, nhead, head_dim, unfold_size, L) v = F.unfold(v.view(B, nhead * head_dim, L, 1), (unfold_size, 1), padding=(unfold_size // 2, 0)) \ .view(B, nhead, head_dim, unfold_size, L) if ax is not None: k = torch.cat([k, ak], 3) v = torch.cat([v, av], 3) alphas = self.drop(F.softmax((q * k).sum(2, keepdim=True) / NP.sqrt(head_dim), 3)) # B N L 1 U att = (alphas * v).sum(3).view(B, nhead * head_dim, L, 1) ret = self.WO(att) return ret