skills/cv/concat-tile-feature-pooling/SKILL.md
Passes N tiles independently through a shared CNN backbone, concatenates their feature maps spatially, then pools for classification — a lightweight multi-instance learning approach.
npx skillsauth add wenmin-wu/ds-skills cv-concat-tile-feature-poolingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
For WSI classification, processing each tile through a shared CNN backbone produces per-tile feature maps. Rather than averaging tile predictions (losing spatial info) or building a full attention-based MIL model, this approach concatenates all tile feature maps along the spatial dimension, then applies adaptive pooling and a classification head. This preserves inter-tile patterns while remaining end-to-end trainable with standard backbones.
import torch
import torch.nn as nn
class ConcatTileModel(nn.Module):
def __init__(self, backbone, n_classes=6):
super().__init__()
self.enc = nn.Sequential(*list(backbone.children())[:-2])
nc = list(backbone.children())[-1].in_features
self.head = nn.Sequential(
nn.AdaptiveAvgPool2d(1), nn.Flatten(),
nn.Linear(nc, 512), nn.ReLU(),
nn.Dropout(0.5), nn.Linear(512, n_classes))
def forward(self, tiles):
"""tiles: list of N tensors, each (B, 3, H, W)"""
B = tiles[0].shape[0]
N = len(tiles)
x = torch.stack(tiles, dim=1) # (B, N, 3, H, W)
x = x.view(B * N, *tiles[0].shape[1:])
x = self.enc(x) # (B*N, C, h, w)
C, h, w = x.shape[1:]
# Concatenate tile features spatially
x = x.view(B, N, C, h, w).permute(0, 2, 1, 3, 4)
x = x.contiguous().view(B, C, N * h, w)
x = self.head(x)
return x
data-ai
Scaled Pinball Loss (SPL) metric for evaluating quantile forecasts, normalized by mean absolute successive differences of training data
data-ai
Walk backward through a time series and multiplicatively rescale segments when jumps exceed a fraction of the running mean to correct data collection anomalies
testing
Transform forecasting target to next/current ratio minus one so that optimizing MAE or squared error implicitly minimizes SMAPE
tools
Convert point forecasts to prediction intervals by scaling with logit-transformed quantile ratios passed through a Normal CDF