Python torch.nn.functional.upsample() Examples
The following are 30
code examples of torch.nn.functional.upsample().
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: deprecated.py From open-solution-salt-identification with MIT License | 6 votes |
def forward(self, x): encoder2, encoder3, encoder4, encoder5 = self.encoders(x) encoder5 = F.dropout2d(encoder5, p=self.dropout_2d) center = self.center(encoder5) dec5 = self.dec5(center, encoder5) dec4 = self.dec4(dec5, encoder4) dec3 = self.dec3(dec4, encoder3) dec2 = self.dec2(dec3, encoder2) dec1 = self.dec1(dec2) if self.use_hypercolumn: dec1 = torch.cat([dec1, F.upsample(dec2, scale_factor=2, mode='bilinear'), F.upsample(dec3, scale_factor=4, mode='bilinear'), F.upsample(dec4, scale_factor=8, mode='bilinear'), F.upsample(dec5, scale_factor=16, mode='bilinear'), ], 1) return self.final(dec1)
Example #2
Source File: psp_net.py From pytorch-semantic-segmentation with MIT License | 6 votes |
def forward(self, x): x_size = x.size() x = self.layer0(x) x = self.layer1(x) x = self.layer2(x) x = self.layer3(x) if self.training and self.use_aux: aux = self.aux_logits(x) x = self.layer4(x) x = self.ppm(x) x = self.final(x) if self.training and self.use_aux: return F.upsample(x, x_size[2:], mode='bilinear'), F.upsample(aux, x_size[2:], mode='bilinear') return F.upsample(x, x_size[2:], mode='bilinear') # just a try, not recommend to use
Example #3
Source File: fpn.py From cascade-rcnn_Pytorch with MIT License | 6 votes |
def _upsample_add(self, x, y): '''Upsample and add two feature maps. Args: x: (Variable) top feature map to be upsampled. y: (Variable) lateral feature map. Returns: (Variable) added feature map. Note in PyTorch, when input size is odd, the upsampled feature map with `F.upsample(..., scale_factor=2, mode='nearest')` maybe not equal to the lateral feature map size. e.g. original input size: [N,_,15,15] -> conv2d feature map size: [N,_,8,8] -> upsampled feature map size: [N,_,16,16] So we choose bilinear upsample which supports arbitrary output sizes. ''' _,_,H,W = y.size() return F.upsample(x, size=(H,W), mode='bilinear') + y
Example #4
Source File: submodule.py From PSMNet with MIT License | 6 votes |
def forward(self, x): output = self.firstconv(x) output = self.layer1(output) output_raw = self.layer2(output) output = self.layer3(output_raw) output_skip = self.layer4(output) output_branch1 = self.branch1(output_skip) output_branch1 = F.upsample(output_branch1, (output_skip.size()[2],output_skip.size()[3]),mode='bilinear') output_branch2 = self.branch2(output_skip) output_branch2 = F.upsample(output_branch2, (output_skip.size()[2],output_skip.size()[3]),mode='bilinear') output_branch3 = self.branch3(output_skip) output_branch3 = F.upsample(output_branch3, (output_skip.size()[2],output_skip.size()[3]),mode='bilinear') output_branch4 = self.branch4(output_skip) output_branch4 = F.upsample(output_branch4, (output_skip.size()[2],output_skip.size()[3]),mode='bilinear') output_feature = torch.cat((output_raw, output_skip, output_branch4, output_branch3, output_branch2, output_branch1), 1) output_feature = self.lastconv(output_feature) return output_feature
Example #5
Source File: resnet.py From sunets with MIT License | 6 votes |
def forward(self, x, labels, th=1.0): x_size = x.size() x = self.layer0(x) x = self.layer1(x) x = self.layer2(x) x = self.layer3(x) x = self.layer4(x) x = self.final(x) x = F.upsample(x, x_size[2:], mode='bilinear') if labels is not None: losses, total_valid_pixel = self.mceloss(x, labels, th=th) classwise_pixel_acc, classwise_gtpixels, classwise_predpixels = prediction_stat([x], labels, self.num_classes) # Need to perform this operation for MultiGPU classwise_pixel_acc = Variable(torch.FloatTensor([classwise_pixel_acc]).cuda()) classwise_gtpixels = Variable(torch.FloatTensor([classwise_gtpixels]).cuda()) classwise_predpixels = Variable(torch.FloatTensor([classwise_predpixels]).cuda()) return x, losses, classwise_pixel_acc, classwise_gtpixels, classwise_predpixels, total_valid_pixel else: return x
Example #6
Source File: resnet.py From sunets with MIT License | 6 votes |
def forward(self, x, labels, th=1.0): x_size = x.size() x = self.layer0(x) x = self.layer1(x) x = self.layer2(x) x = self.layer3(x) x = self.layer4(x) x = self.final(x) x = F.upsample(x, x_size[2:], mode='bilinear') if labels is not None: losses, total_valid_pixel = self.mceloss(x, labels, th=th) classwise_pixel_acc, classwise_gtpixels, classwise_predpixels = prediction_stat([x], labels, self.num_classes) # Need to perform this operation for MultiGPU classwise_pixel_acc = Variable(torch.FloatTensor([classwise_pixel_acc]).cuda()) classwise_gtpixels = Variable(torch.FloatTensor([classwise_gtpixels]).cuda()) classwise_predpixels = Variable(torch.FloatTensor([classwise_predpixels]).cuda()) return x, losses, classwise_pixel_acc, classwise_gtpixels, classwise_predpixels, total_valid_pixel else: return x
Example #7
Source File: models.py From AdaptiveWingLoss with Apache License 2.0 | 6 votes |
def _forward(self, level, inp): # Upper branch up1 = inp up1 = self._modules['b1_' + str(level)](up1) # Lower branch low1 = F.avg_pool2d(inp, 2, stride=2) low1 = self._modules['b2_' + str(level)](low1) if level > 1: low2 = self._forward(level - 1, low1) else: low2 = low1 low2 = self._modules['b2_plus_' + str(level)](low2) low3 = low2 low3 = self._modules['b3_' + str(level)](low3) up2 = F.upsample(low3, scale_factor=2, mode='nearest') return up1 + up2
Example #8
Source File: fpn.py From cascade-rcnn_Pytorch with MIT License | 6 votes |
def _upsample_add(self, x, y): '''Upsample and add two feature maps. Args: x: (Variable) top feature map to be upsampled. y: (Variable) lateral feature map. Returns: (Variable) added feature map. Note in PyTorch, when input size is odd, the upsampled feature map with `F.upsample(..., scale_factor=2, mode='nearest')` maybe not equal to the lateral feature map size. e.g. original input size: [N,_,15,15] -> conv2d feature map size: [N,_,8,8] -> upsampled feature map size: [N,_,16,16] So we choose bilinear upsample which supports arbitrary output sizes. ''' _,_,H,W = y.size() return F.upsample(x, size=(H,W), mode='bilinear') + y
Example #9
Source File: model.py From sagan-pytorch with Apache License 2.0 | 6 votes |
def __init__(self, n_class=10): super().__init__() def conv(in_channel, out_channel, stride=2, self_attention=False): return ConvBlock(in_channel, out_channel, stride=stride, bn=False, activation=leaky_relu, upsample=False, self_attention=self_attention) self.conv = nn.Sequential(conv(3, 128), conv(128, 256), conv(256, 512, stride=1, self_attention=True), conv(512, 512), conv(512, 512), conv(512, 512)) self.linear = spectral_init(nn.Linear(512, 1)) self.embed = nn.Embedding(n_class, 512) self.embed.weight.data.uniform_(-0.1, 0.1) self.embed = spectral_norm(self.embed)
Example #10
Source File: model.py From sagan-pytorch with Apache License 2.0 | 6 votes |
def forward(self, input, class_id=None): out = input if self.upsample: out = F.upsample(out, scale_factor=2) out = self.conv(out) if self.bn: out = self.norm(out, class_id) if self.activation is not None: out = self.activation(out) if self.self_attention: out = self.attention(out) return out
Example #11
Source File: model.py From sagan-pytorch with Apache License 2.0 | 6 votes |
def __init__(self, in_channel, out_channel, kernel_size=[3, 3], padding=1, stride=1, n_class=None, bn=True, activation=F.relu, upsample=True, self_attention=False): super().__init__() self.conv = spectral_init(nn.Conv2d(in_channel, out_channel, kernel_size, stride, padding, bias=False if bn else True)) self.upsample = upsample self.activation = activation self.bn = bn if bn: self.norm = ConditionalNorm(out_channel, n_class) self.self_attention = self_attention if self_attention: self.attention = SelfAttention(out_channel, 1)
Example #12
Source File: grid_attention_layer.py From Attention-Gated-Networks with MIT License | 6 votes |
def _concatenation_debug(self, x, g): input_size = x.size() batch_size = input_size[0] assert batch_size == g.size(0) # theta => (b, c, t, h, w) -> (b, i_c, t, h, w) -> (b, i_c, thw) # phi => (b, g_d) -> (b, i_c) theta_x = self.theta(x) theta_x_size = theta_x.size() # g (b, c, t', h', w') -> phi_g (b, i_c, t', h', w') # Relu(theta_x + phi_g + bias) -> f = (b, i_c, thw) -> (b, i_c, t/s1, h/s2, w/s3) phi_g = F.upsample(self.phi(g), size=theta_x_size[2:], mode=self.upsample_mode) f = F.softplus(theta_x + phi_g) # psi^T * f -> (b, psi_i_c, t/s1, h/s2, w/s3) sigm_psi_f = F.sigmoid(self.psi(f)) # upsample the attentions and multiply sigm_psi_f = F.upsample(sigm_psi_f, size=input_size[2:], mode=self.upsample_mode) y = sigm_psi_f.expand_as(x) * x W_y = self.W(y) return W_y, sigm_psi_f
Example #13
Source File: grid_attention_layer.py From Attention-Gated-Networks with MIT License | 6 votes |
def _concatenation_residual(self, x, g): input_size = x.size() batch_size = input_size[0] assert batch_size == g.size(0) # theta => (b, c, t, h, w) -> (b, i_c, t, h, w) -> (b, i_c, thw) # phi => (b, g_d) -> (b, i_c) theta_x = self.theta(x) theta_x_size = theta_x.size() # g (b, c, t', h', w') -> phi_g (b, i_c, t', h', w') # Relu(theta_x + phi_g + bias) -> f = (b, i_c, thw) -> (b, i_c, t/s1, h/s2, w/s3) phi_g = F.upsample(self.phi(g), size=theta_x_size[2:], mode=self.upsample_mode) f = F.relu(theta_x + phi_g, inplace=True) # psi^T * f -> (b, psi_i_c, t/s1, h/s2, w/s3) f = self.psi(f).view(batch_size, 1, -1) sigm_psi_f = F.softmax(f, dim=2).view(batch_size, 1, *theta_x.size()[2:]) # upsample the attentions and multiply sigm_psi_f = F.upsample(sigm_psi_f, size=input_size[2:], mode=self.upsample_mode) y = sigm_psi_f.expand_as(x) * x W_y = self.W(y) return W_y, sigm_psi_f
Example #14
Source File: retina.py From ssds.pytorch with MIT License | 6 votes |
def _upsample_add(self, x, y): '''Upsample and add two feature maps. Args: x: (Variable) top feature map to be upsampled. y: (Variable) lateral feature map. Returns: (Variable) added feature map. Note in PyTorch, when input size is odd, the upsampled feature map with `F.upsample(..., scale_factor=2, mode='nearest')` maybe not equal to the lateral feature map size. e.g. original input size: [N,_,15,15] -> conv2d feature map size: [N,_,8,8] -> upsampled feature map size: [N,_,16,16] So we choose bilinear upsample which supports arbitrary output sizes. ''' _,_,H,W = y.size() return F.upsample(x, size=(H,W), mode='bilinear') + y
Example #15
Source File: grid_attention_layer.py From Attention-Gated-Networks with MIT License | 6 votes |
def _concatenation(self, x, g): input_size = x.size() batch_size = input_size[0] assert batch_size == g.size(0) # theta => (b, c, t, h, w) -> (b, i_c, t, h, w) -> (b, i_c, thw) # phi => (b, g_d) -> (b, i_c) theta_x = self.theta(x) theta_x_size = theta_x.size() # g (b, c, t', h', w') -> phi_g (b, i_c, t', h', w') # Relu(theta_x + phi_g + bias) -> f = (b, i_c, thw) -> (b, i_c, t/s1, h/s2, w/s3) phi_g = F.upsample(self.phi(g), size=theta_x_size[2:], mode=self.upsample_mode) f = F.relu(theta_x + phi_g, inplace=True) # psi^T * f -> (b, psi_i_c, t/s1, h/s2, w/s3) sigm_psi_f = F.sigmoid(self.psi(f)) # upsample the attentions and multiply sigm_psi_f = F.upsample(sigm_psi_f, size=input_size[2:], mode=self.upsample_mode) y = sigm_psi_f.expand_as(x) * x W_y = self.W(y) return W_y, sigm_psi_f
Example #16
Source File: deprecated.py From open-solution-salt-identification with MIT License | 6 votes |
def forward(self, x, d=None): encoder2, encoder3, encoder4, encoder5 = self.encoders(x) encoder5 = F.dropout2d(encoder5, p=self.dropout_2d) center = self.center(encoder5) dec5 = self.dec5(center, encoder5) dec4 = self.dec4(dec5, encoder4) dec3 = self.dec3(dec4, encoder3) dec2 = self.dec2(dec3, encoder2) dec1 = self.dec1(dec2) if self.use_hypercolumn: dec1 = torch.cat([dec1, F.upsample(dec2, scale_factor=2, mode='bilinear'), F.upsample(dec3, scale_factor=4, mode='bilinear'), F.upsample(dec4, scale_factor=8, mode='bilinear'), F.upsample(dec5, scale_factor=16, mode='bilinear'), ], 1) depth_channel_excitation = self.depth_channel_excitation(dec1, d) return self.final(depth_channel_excitation)
Example #17
Source File: unet.py From open-solution-salt-identification with MIT License | 6 votes |
def forward(self, x): encoder2, encoder3, encoder4, encoder5 = self.encoders(x) encoder5 = F.dropout2d(encoder5, p=self.dropout_2d) center = self.center(encoder5) dec5 = self.dec5(center, encoder5) dec4 = self.dec4(dec5, encoder4) dec3 = self.dec3(dec4, encoder3) dec2 = self.dec2(dec3, encoder2) dec1 = self.dec1(dec2) if self.use_hypercolumn: dec1 = torch.cat([dec1, F.upsample(dec2, scale_factor=2, mode='bilinear'), F.upsample(dec3, scale_factor=4, mode='bilinear'), F.upsample(dec4, scale_factor=8, mode='bilinear'), F.upsample(dec5, scale_factor=16, mode='bilinear'), ], 1) return self.final(dec1)
Example #18
Source File: unet.py From open-solution-salt-identification with MIT License | 6 votes |
def forward(self, x): encoder2, encoder3, encoder4, encoder5 = self.encoders(x) encoder5 = F.dropout2d(encoder5, p=self.dropout_2d) center = self.center(encoder5) dec5 = self.dec5(center, encoder5) dec4 = self.dec4(dec5, encoder4) dec3 = self.dec3(dec4, encoder3) dec2 = self.dec2(dec3, encoder2) dec1 = self.dec1(dec2) if self.use_hypercolumn: dec1 = torch.cat([dec1, F.upsample(dec2, scale_factor=2, mode='bilinear'), F.upsample(dec3, scale_factor=4, mode='bilinear'), F.upsample(dec4, scale_factor=8, mode='bilinear'), F.upsample(dec5, scale_factor=16, mode='bilinear'), ], 1) return self.final(dec1)
Example #19
Source File: unet.py From open-solution-salt-identification with MIT License | 6 votes |
def forward(self, x): encoder2, encoder3, encoder4, encoder5 = self.encoders(x) encoder5 = F.dropout2d(encoder5, p=self.dropout_2d) center = self.center(encoder5) dec5 = self.dec5(center, encoder5) dec4 = self.dec4(dec5, encoder4) dec3 = self.dec3(dec4, encoder3) dec2 = self.dec2(dec3, encoder2) dec1 = self.dec1(dec2) if self.use_hypercolumn: dec1 = torch.cat([dec1, F.upsample(dec2, scale_factor=2, mode='bilinear'), F.upsample(dec3, scale_factor=4, mode='bilinear'), F.upsample(dec4, scale_factor=8, mode='bilinear'), F.upsample(dec5, scale_factor=16, mode='bilinear'), ], 1) return self.final(dec1)
Example #20
Source File: models_with_depth.py From open-solution-salt-identification with MIT License | 6 votes |
def forward(self, x, d=None): encoder2, encoder3, encoder4, encoder5 = self.encoders(x) encoder5 = F.dropout2d(encoder5, p=self.dropout_2d) center = self.center(encoder5) dec5 = self.dec5(center, encoder5) dec4 = self.dec4(dec5, encoder4) dec3 = self.dec3(dec4, encoder3) dec2 = self.dec2(dec3, encoder2) dec1 = self.dec1(dec2) if self.use_hypercolumn: dec1 = torch.cat([dec1, F.upsample(dec2, scale_factor=2, mode='bilinear'), F.upsample(dec3, scale_factor=4, mode='bilinear'), F.upsample(dec4, scale_factor=8, mode='bilinear'), F.upsample(dec5, scale_factor=16, mode='bilinear'), ], 1) depth_channel_excitation = self.depth_channel_excitation(dec1, d) return self.final(depth_channel_excitation)
Example #21
Source File: loss.py From DSMnet with Apache License 2.0 | 6 votes |
def losses_pyramid0(self, disp_gt, disps, scale_disps, flag_smooth=False): count = len(scale_disps) _, _, h, w = disp_gt.shape loss = 0 for i in range(0, count): level = scale_disps[i] weight = self.weight_levels[level] if(weight <= 0): continue if(level > 0): pred = F.upsample(disps[i], scale_factor=2**level, mode='bilinear')[:, :, :h, :w] else: pred = disps[i] loss = loss + self.lossfun(disp_gt, pred, flag_smooth, factor=1)*weight return loss # losses for depthmono/common/Cap_ds_lr
Example #22
Source File: submodule.py From DSMnet with Apache License 2.0 | 6 votes |
def forward(self, x): output = self.firstconv(x) output = self.layer1(output) output_raw = self.layer2(output) output = self.layer3(output_raw) output_skip = self.layer4(output) output_branch1 = self.branch1(output_skip) output_branch1 = F.upsample(output_branch1, (output_skip.size()[2],output_skip.size()[3]),mode='bilinear') output_branch2 = self.branch2(output_skip) output_branch2 = F.upsample(output_branch2, (output_skip.size()[2],output_skip.size()[3]),mode='bilinear') output_branch3 = self.branch3(output_skip) output_branch3 = F.upsample(output_branch3, (output_skip.size()[2],output_skip.size()[3]),mode='bilinear') output_branch4 = self.branch4(output_skip) output_branch4 = F.upsample(output_branch4, (output_skip.size()[2],output_skip.size()[3]),mode='bilinear') output_feature = torch.cat((output_raw, output_skip, output_branch4, output_branch3, output_branch2, output_branch1), 1) output_feature = self.lastconv(output_feature) return output_feature
Example #23
Source File: pspnet.py From open-solution-salt-identification with MIT License | 6 votes |
def forward(self, x): encoder2, encoder3, encoder4, encoder5 = self.encoders(x) encoder5 = F.dropout2d(encoder5, p=self.dropout_2d) psp = self.psp(encoder5) up4 = self.up4(psp) up3 = self.up3(up4) up2 = self.up2(up3) up1 = self.up1(up2) if self.use_hypercolumn: hypercolumn = torch.cat([up1, F.upsample(up2, scale_factor=2, mode='bilinear'), F.upsample(up3, scale_factor=4, mode='bilinear'), F.upsample(up4, scale_factor=8, mode='bilinear'), ], 1) drop = F.dropout2d(hypercolumn, p=self.dropout_2d) else: drop = F.dropout2d(up4, p=self.dropout_2d) return self.final(drop)
Example #24
Source File: face_ssd.py From DSFD-Pytorch-Inference with Apache License 2.0 | 6 votes |
def _upsample_product(self, x, y): '''Upsample and add two feature maps. Args: x: (Variable) top feature map to be upsampled. y: (Variable) lateral feature map. Returns: (Variable) added feature map. Note in PyTorch, when input size is odd, the upsampled feature map with `F.upsample(..., scale_factor=2, mode='nearest')` maybe not equal to the lateral feature map size. e.g. original input size: [N,_,15,15] -> conv2d feature map size: [N,_,8,8] -> upsampled feature map size: [N,_,16,16] So we choose bilinear upsample which supports arbitrary output sizes. ''' # Deprecation warning. align_corners=False default in 0.4.0, but in 0.3.0 it was True # Original code was written in 0.3.1, I guess this is correct. return y * F.interpolate( x, size=y.shape[2:], mode="bilinear", align_corners=True)
Example #25
Source File: FAN_feature_extractor.py From Talking-Face-Generation-DAVS with MIT License | 6 votes |
def _forward(self, level, inp): # Upper branch up1 = inp up1 = self._modules['b1_' + str(level)](up1) up1 = self.dropout(up1) # Lower branch low1 = F.max_pool2d(inp, 2, stride=2) low1 = self._modules['b2_' + str(level)](low1) if level > 1: low2 = self._forward(level - 1, low1) else: low2 = low1 low2 = self._modules['b2_plus_' + str(level)](low2) low3 = low2 low3 = self._modules['b3_' + str(level)](low3) up1size = up1.size() rescale_size = (up1size[2], up1size[3]) up2 = F.upsample(low3, size=rescale_size, mode='bilinear') return up1 + up2
Example #26
Source File: pspnet.py From open-solution-salt-identification with MIT License | 5 votes |
def forward(self, x): p = F.upsample(input=x, scale_factor=2, mode='bilinear') return self.conv(p)
Example #27
Source File: resnet_v1.py From pytorch-FPN with MIT License | 5 votes |
def __init__(self, planes=256): super(BuildBlock, self).__init__() # Top-down layers, use nn.ConvTranspose2d to replace nn.Conv2d+F.upsample? self.toplayer1 = nn.Conv2d(2048, planes, kernel_size=1, stride=1, padding=0) # Reduce channels self.toplayer2 = nn.Conv2d( 256, planes, kernel_size=3, stride=1, padding=1) self.toplayer3 = nn.Conv2d( 256, planes, kernel_size=3, stride=1, padding=1) self.toplayer4 = nn.Conv2d( 256, planes, kernel_size=3, stride=1, padding=1) # Lateral layers self.latlayer1 = nn.Conv2d(1024, planes, kernel_size=1, stride=1, padding=0) self.latlayer2 = nn.Conv2d( 512, planes, kernel_size=1, stride=1, padding=0) self.latlayer3 = nn.Conv2d( 256, planes, kernel_size=1, stride=1, padding=0) self.subsample = nn.AvgPool2d(2, stride=2)
Example #28
Source File: ccnet.py From CCNet with MIT License | 5 votes |
def forward(self, feats): h, w = feats.size(2), feats.size(3) priors = [F.upsample(input=stage(feats), size=(h, w), mode='bilinear', align_corners=True) for stage in self.stages] + [feats] bottle = self.bottleneck(torch.cat(priors, 1)) return bottle
Example #29
Source File: pspnet.py From CCNet with MIT License | 5 votes |
def forward(self, feats): h, w = feats.size(2), feats.size(3) priors = [F.upsample(input=stage(feats), size=(h, w), mode='bilinear', align_corners=True) for stage in self.stages] + [feats] bottle = self.bottleneck(torch.cat(priors, 1)) return bottle
Example #30
Source File: fpn.py From Clothing-Detection with GNU General Public License v3.0 | 5 votes |
def forward(self, x): """ Arguments: x (list[Tensor]): feature maps for each feature level. Returns: results (tuple[Tensor]): feature maps after FPN layers. They are ordered from highest resolution first. """ last_inner = getattr(self, self.inner_blocks[-1])(x[-1]) results = [] results.append(getattr(self, self.layer_blocks[-1])(last_inner)) for feature, inner_block, layer_block in zip( x[:-1][::-1], self.inner_blocks[:-1][::-1], self.layer_blocks[:-1][::-1] ): if not inner_block: continue inner_top_down = F.interpolate(last_inner, scale_factor=2, mode="nearest") inner_lateral = getattr(self, inner_block)(feature) # TODO use size instead of scale to make it robust to different sizes # inner_top_down = F.upsample(last_inner, size=inner_lateral.shape[-2:], # mode='bilinear', align_corners=False) last_inner = inner_lateral + inner_top_down results.insert(0, getattr(self, layer_block)(last_inner)) if isinstance(self.top_blocks, LastLevelP6P7): last_results = self.top_blocks(x[-1], results[-1]) results.extend(last_results) elif isinstance(self.top_blocks, LastLevelMaxPool): last_results = self.top_blocks(results[-1]) results.extend(last_results) return tuple(results)