Paper · 2021-03-31 · cs.CV, cs.LG
DER: Dynamically Expandable Representation for Class Incremental Learning
DER does class-incremental image classification by freezing the feature extractors of earlier steps and adding a new one per step, concatenating all features before one linear classifier. It adds an auxiliary new-vs-old loss, channel-mask pruning (described, not released), and a balanced classifier retrain. Reports 72.05% average accuracy on CIFAR-100 with 50 steps (prior best 64.32%).
Continual learningDynamic network expansioncontinual-learningclass-incremental-learningdynamic-architecturecatastrophic-forgettingexemplar-memorynetwork-pruningimage-classification
arXivPDFCodeMarkdown17 min read
AI-compiled by claude-haiku-5-5 on 2026-10-18, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.
In plain words
A class-incremental learner has to pick up new categories over time, and it may keep only a small set of old example images. The usual failure is that training on new categories makes the model forget the old ones.
DER handles this by growing the network instead of only retraining it. At each new round it freezes everything it has already learned and adds a fresh block of feature detectors trained on the new categories. The final decision uses the outputs of all blocks side by side, so the old knowledge is still present and unchanged. A helper output is trained to tell new categories from old ones, which pushes the new block toward features that are actually different from the old ones. The authors also describe a way to switch off unneeded parts of the new block so the network does not grow too quickly.
Because the old blocks are frozen, the model can grow with every round, so it gets bigger over time. At the end of each round the last layer is retrained on a balanced set of examples, so the model is not biased toward the newest categories. The authors report that this beats earlier methods on standard image benchmarks.
TL;DR
DER is a class-incremental image classifier with a rehearsal memory §3.1. Each step freezes all earlier extractors and adds a new one, initialized from the previous extractor, and feeds the concatenated features to a single linear classifier §3.2 eq. 1 eq. 2. The new extractor is trained with cross-entropy plus an auxiliary new-vs-old loss eq. 3 eq. 4, then the classifier is retrained on a class-balanced subset §3.4. The paper also describes channel-mask pruning with a sparsity loss §3.3; the released code does not contain it, so only the un-pruned variant can be reproduced from the repository default.yaml.
Problem
The model sees new class groups over time and must classify every class seen so far, with no task identity at test time. Only a limited memory of old examples can be kept §3.1. The paper frames the core difficulty as the stability-plasticity trade-off: too much plasticity causes catastrophic forgetting, while too much stability blocks new concepts §1. Earlier approaches each give something up. Regularization methods such as EWC rest on a Laplace approximation that restricts how far weights can move §2. Distillation methods depend on the quality and amount of stored data §2. Structure-based methods that allocate new parameters still forget: RPSNet sums features across steps, and CCGN freezes only part of the layers §2, Discussion. The paper reports a large gap between these methods and a model trained on all data at once §1 fig. 1.
Method
Setting and two-stage learning (§3.1). At step t the model receives data D_t for a new class set Y_t and keeps a memory M_t of old examples (rehearsal). Learning at each step is split into two stages: representation learning, and then classifier learning §3.1.
Expandable representation (§3.2). At step t the feature extractor is Φ_t(x) = [Φ_{t-1}(x), F_t(x)], where F_t is a new extractor eq. 1. The prediction is Softmax(H_t(u)) on the concatenated feature u eq. 2. The earlier extractors (their parameters and BatchNorm statistics) are not updated at step t. F_t is initialized from F_{t-1} for faster adaptation §3.2. The classifier H_t keeps its old input weights from H_{t-1} and gets new, randomly initialized weights for the new input dimensions §3.2.
Training uses cross-entropy over memory plus new data eq. 3. An auxiliary classifier H^a_t reads only F_t(x) and has |Y_t|+1 outputs: the new classes and one merged "old" class §3.2. The expandable-representation loss is L_ER = L_H + λ_a·L_Ha eq. 4, with λ_a = 0 at the first step §3.2.
Dynamical expansion by channel masks (§3.3, paper only). The paper adapts channel-level masks from HAT §3.3. Each channel of a layer's feature map is multiplied by a gate m = σ(s·e), where e are learnable mask parameters and s sharpens the sigmoid eq. 5 eq. 6. Old extractors are replaced by pruned versions, and during training the new block uses soft masks eq. 7. Within each epoch s grows linearly from 1/s_max to s_max across batches eq. 8. The gradient with respect to e is rescaled to cancel the effect of s eq. 9. A sparsity loss measures the share of weights still in use, weighted by kernel sizes; the input layer's mask norm is set to 3 eq. 10. The total loss is L_DER = L_H + λ_a·L_Ha + λ_s·L_S eq. 11. After training, masks are binarized (large s) and the block is pruned §3.3.
Classifier learning (§3.4). After the representation is learned, the classifier is re-initialized and retrained only on a class-balanced subset of D_t ∪ M_t, with cross-entropy and a softmax temperature δ §3.4. The extractors stay fixed in this stage §3.4.
# DER, one incremental step t >= 2 [§3.2]
# Input: frozen extractors F_1..F_{t-1}, new images and labels, memory
def add_extractor(extractors):
# The new extractor starts from the last one [§3.2]
extractors.append(copy_of(extractors[-1]))
# Old extractors: no gradients, BatchNorm in eval mode [§3.2]
for old in extractors[:-1]:
freeze(old)
return extractors
def forward(extractors, classifier, aux_head, images):
# Concatenate every extractor's features [eq. 1]
features = concat([f(images) for f in extractors], axis=1)
logits = classifier(features) # (B, n_seen)
# Auxiliary head reads only the new extractor [§3.2]
new_features = features[:, -new_dim:] # (B, d)
aux_logits = aux_head(new_features) # (B, n_new + 1)
return logits, aux_logits
def loss_step(logits, aux_logits, labels, n_old, step):
# Cross-entropy over all seen classes [eq. 3]
loss_ce = cross_entropy(logits, labels)
# Old classes -> 0, new classes -> 1..n_new [§3.2]
old_mask = labels < n_old
aux_labels = where(old_mask, 0, labels - n_old + 1)
loss_aux = cross_entropy(aux_logits, aux_labels)
# lambda_a = 1 in all experiments; no aux term at step 1 [§3.2] [app.]
if step == 1:
return loss_ce
return loss_ce + loss_aux# Classifier learning after the representation [§3.4]
# Input: class-balanced subset of new data plus memory
def classifier_stage(classifier, extractors, balanced_data, delta):
# Re-initialize the classifier head [§3.4]
classifier.reset_parameters()
for images, labels in balanced_data:
# Extractors are fixed; only the head is trained [§3.4]
logits = classifier(extractors(images))
# Temperature-scaled softmax [§3.4]
loss = cross_entropy(logits / delta, labels)
update(classifier, loss)# Paper only: channel masks, not in the released code [§3.3]
# Input: feature maps (B, C, H, W), learnable mask logits e (C,), sharpness s
def masked_features(features, mask_logits, s):
# Sigmoid gate per channel [eq. 6] [eq. 5]
mask = sigmoid(s * mask_logits) # (C,)
return features * mask[None, :, None, None] # (B, C, H, W)
def sharpness(batch_index, n_batches, s_max):
# Linear ramp inside each epoch [eq. 8]
low = 1.0 / s_max
frac = (batch_index - 1) / (n_batches - 1)
return low + (s_max - low) * fracHyperparameters
Values in the paper are in the appendix ("Hyperparameters") and §4.1. Values from the released configuration are cited separately where they differ.
| Name | Value | Where | Notes |
|---|---|---|---|
| Backbone, CIFAR-100 | ResNet-18 | §4.1 | Following RPSNet; standard ResNet-18, not the modified ResNet-32 §4.1. Code: resnet18 1.yaml |
| Backbone, ImageNet | 18-layer ResNet | §4.1 | Code config uses preact_resnet18 1.yaml |
| Modified ResNet-32 | used for a separate CIFAR-100 table | app. Results for modified 32-layer ResNet | Other methods' numbers come from their papers there |
| Optimizer, representation | SGD, momentum 0.9 | §4.1 | Momentum not stated in paper; code sets 0.9 factory.py |
| Batch size, CIFAR-100 | 128 | app. Hyperparameters | |
| Batch size, ImageNet | 256 | app. Hyperparameters | 1.yaml |
| Weight decay, representation | 0.0005 | app. Hyperparameters | |
| Warmup | to lr 0.1 over 10 epochs (CIFAR-100); "same strategy" for ImageNet | app. Hyperparameters | ImageNet config: 20 epochs 1.yaml |
| Epochs and LR schedule, CIFAR-100 | 160 epochs after warmup; LR ×0.1 at 100 and 120 | app. Hyperparameters | Config: 170 total, milestones 100 and 120 1.yaml |
| Epochs and LR schedule, ImageNet | 120 epochs after warmup; LR ×0.1 at 30, 60, 80, 90 | app. Hyperparameters | Config: 220 total, milestones 60, 120, 160, 180 1.yaml |
| Learning rate, representation | 0.1 start | app. Hyperparameters | |
| λ_a (aux loss weight) | 1 for all experiments; 0 at step 1 | app. Hyperparameters §3.2 | Not a config key; fixed to 1 in code incmodel.py |
| λ_s (sparsity), CIFAR-100 B0 | 0.75 | app. Hyperparameters | Chosen to match parameter counts of other methods app. Hyperparameters |
| λ_s (sparsity), CIFAR-100 B50 | 0.25 | app. Hyperparameters | |
| λ_s (sparsity), ImageNet100 B0 / B50 | 0.75 / 0.5 | app. Hyperparameters | |
| λ_s (sparsity), ImageNet1000 | 0.75 | app. Hyperparameters | |
| s_max (mask sharpness) | not stated | §3.3 | Needed by eq. 8; no value in paper or code |
| Gradient-compensation and mask details | not stated beyond eq. 9 | §3.3 | Mask init values not stated |
| Classifier stage optimizer | SGD, weight decay 0.0005 | app. Hyperparameters | Momentum not stated; code 0.9 utils.py |
| Classifier stage epochs | 30 | app. Hyperparameters | |
| Classifier stage LR | 0.1, ×0.1 at epoch 15 | app. Hyperparameters | 1.yaml |
| Temperature δ | 5 (CIFAR-100), 1 (ImageNet) | app. Hyperparameters | 1.yaml 1.yaml |
| Hyperparameter tuning | on a validation split held out from training data | §4.1 | Split size not stated |
| Memory, CIFAR-100 B0 | 2000 exemplars in total (fixed) | §4.1 | Config: 2000 total, 20 per class 1.yaml |
| Memory, CIFAR-100 B50 | 20 per class | §4.1 | |
| Memory, ImageNet100 B0 | 2000 in total (fixed) | §4.1 | |
| Memory, ImageNet100 B50 | 20 per class | §4.1 | |
| Memory, ImageNet1000 B0 | 20000 in total | §4.1 | |
| Exemplar selection | herding for ImageNet | §4.1 | Not stated for CIFAR-100; config uses iCaRL coreset 1.yaml |
| Class orders | 3 orders, mean ± std (CIFAR-100) | §4.1 tab. 1 | ImageNet tables show no ± values |
| Hardware | GTX 1080Ti (latency test only) | app. Latency | Training hardware not stated |
Results
Author-reported. Average incremental accuracy (top-1 over steps) unless marked. "Bound" is the paper's row label; fig. 1 calls the model trained on all data "Joint", and no table defines the label further fig. 1. Setup: ResNet-18 on CIFAR-100 and ImageNet with the protocols in §4.1. Baselines were rerun by the authors on the same class orders unless they had no released code, in which case the authors used their own implementation; RPSNet numbers are copied from its paper §4.1.
CIFAR-100, B0 protocol (100 classes, all in steps; memory 2000) tab. 1
| Method | 5 steps #Paras | 5 steps Avg | 10 steps #Paras | 10 steps Avg | 20 steps #Paras | 20 steps Avg | 50 steps #Paras | 50 steps Avg |
|---|---|---|---|---|---|---|---|---|
| Bound | 11.2 | 80.40 | 11.2 | 80.41 | 11.2 | 81.49 | 11.2 | 81.74 |
| iCaRL | 11.2 | 71.14 ± 0.34 | 11.2 | 65.27 ± 1.02 | 11.2 | 61.20 ± 0.83 | 11.2 | 56.08 ± 0.83 |
| UCIR | 11.2 | 62.77 ± 0.82 | 11.2 | 58.66 ± 0.71 | 11.2 | 58.17 ± 0.30 | 11.2 | 56.86 ± 3.74 |
| BiC | 11.2 | 73.10 ± 0.55 | 11.2 | 68.80 ± 1.20 | 11.2 | 66.48 ± 0.32 | 11.2 | 62.09 ± 0.85 |
| WA | 11.2 | 72.81 ± 0.28 | 11.2 | 69.46 ± 0.29 | 11.2 | 67.33 ± 0.15 | 11.2 | 64.32 ± 0.28 |
| PODNet | 11.2 | 66.70 ± 0.64 | 11.2 | 58.03 ± 1.27 | 11.2 | 53.97 ± 0.85 | 11.2 | 51.19 ± 1.02 |
| RPSNet (from its paper) | 60.6 | 70.5 | 56.5 | 68.6 | - | - | - | - |
| DER without pruning | 33.6 | 76.80 ± 0.79 | 61.6 | 75.36 ± 0.36 | 117.6 | 74.09 ± 0.33 | 285.6 | 72.41 ± 0.36 |
| DER (with pruning) | 2.89 | 75.55 ± 0.65 | 4.96 | 74.64 ± 0.28 | 7.21 | 73.98 ± 0.36 | 10.15 | 72.05 ± 0.55 |
The paper's gain column is against the best baseline in each column, which is BiC at 5 steps and WA at 10, 20 and 50 steps tab. 1.
CIFAR-100, B50 protocol (50 classes first, then 2, 5 or 10 steps; 20 exemplars per class) tab. 2
| Method | 2 steps #Paras | 2 steps Avg | 5 steps #Paras | 5 steps Avg | 10 steps #Paras | 10 steps Avg |
|---|---|---|---|---|---|---|
| Bound | 11.2 | 77.22 | 11.2 | 79.89 | 11.2 | 79.91 |
| iCaRL | 11.2 | 71.33 ± 0.35 | 11.2 | 65.06 ± 0.53 | 11.2 | 58.59 ± 0.95 |
| UCIR | 11.2 | 67.21 ± 0.35 | 11.2 | 64.28 ± 0.19 | 11.2 | 59.92 ± 2.40 |
| BiC | 11.2 | 72.47 ± 0.99 | 11.2 | 66.62 ± 0.45 | 11.2 | 60.25 ± 0.34 |
| WA | 11.2 | 71.43 ± 0.65 | 11.2 | 64.01 ± 1.62 | 11.2 | 57.86 ± 0.81 |
| PODNet | 11.2 | 71.30 ± 0.46 | 11.2 | 67.25 ± 0.27 | 11.2 | 64.04 ± 0.43 |
| DER without pruning | 22.4 | 74.61 ± 0.52 | 39.2 | 73.21 ± 0.78 | 67.2 | 72.81 ± 0.88 |
| DER (with pruning) | 3.90 | 74.57 ± 0.42 | 6.13 | 72.60 ± 0.78 | 8.79 | 72.45 ± 0.76 |
ImageNet-100 and ImageNet-1000 tab. 3
| Method | IN100-B0 #Paras | top-1 Avg | top-1 Last | top-5 Avg | top-5 Last | IN1000-B0 #Paras | top-1 Avg | top-1 Last | top-5 Avg | top-5 Last |
|---|---|---|---|---|---|---|---|---|---|---|
| Bound | 11.2 | - | - | - | 95.1 | 11.2 | 89.27 | - | - | - |
| iCaRL | 11.2 | - | - | 83.6 | 63.8 | 11.2 | 38.4 | 22.7 | 63.7 | 44.0 |
| BiC | 11.2 | - | - | 90.6 | 84.4 | 11.2 | - | - | 84.0 | 73.2 |
| WA | 11.2 | - | - | 91.0 | 84.1 | 11.2 | 65.67 | 55.6 | 86.6 | 81.1 |
| RPSNet | - | - | - | 87.9 | 74.0 | - | - | - | - | - |
| DER without pruning | 61.6 | 77.18 | 66.70 | 93.23 | 87.52 | 61.6 | 68.84 | 60.16 | 88.17 | 82.86 |
| DER (with pruning) | 7.67 | 76.12 | 66.06 | 92.79 | 88.38 | 14.52 | 66.73 | 58.62 | 87.08 | 81.89 |
ImageNet-100 B50 (50 classes first, then 10 steps; 20 per class) tab. 3:
| Method | #Paras | top-1 Avg | top-1 Last | top-5 Avg | top-5 Last |
|---|---|---|---|---|---|
| Bound | 11.2 | 81.20 | 81.5 | - | - |
| UCIR | 11.2 | 68.09 | 57.3 | - | - |
| PODNet | 11.2 | 74.33 | - | - | - |
| TPCIL | 11.2 | 74.81 | 66.91 | - | - |
| DER without pruning | 67.20 | 78.20 | 74.92 | 94.20 | 91.30 |
| DER (with pruning) | 8.87 | 77.73 | 72.06 | 94.01 | 91.64 |
Headline claims the text makes from these tables: on CIFAR-100 B0 with 50 steps, the average goes from 64.32% (WA) to 72.05% (+7.73) with fewer parameters §4.2; the last-step accuracy gap is reported as 42.75% → 58.66% for that setting §4.2. On CIFAR-100 B50 with 10 steps, DER beats PODNet by 8.41 points average accuracy §4.2 tab. 2. On ImageNet-100 B0, top-5 average beats the best baseline by about 1.79 points §4.3 tab. 3.
Ablation, CIFAR-100 B0 at 10 steps tab. 4
| Expandable representation | Auxiliary loss | Avg | Last |
|---|---|---|---|
| no | no | 61.84 | 40.81 |
| yes | no | 73.26 | 63.07 |
| yes | yes | 75.36 | 65.34 |
Forgetting and forward transfer, CIFAR-100 B0 at 10 steps tab. 5
| Metric (%) | iCaRL | UCIR | BiC | WA | PODNet | DER |
|---|---|---|---|---|---|---|
| BWT | -4.14 | -8.52 | -3.40 | -3.18 | -16.27 | +1.36 |
| FWT | -4.91 | -5.56 | -0.17 | +0.82 | -5.58 | +1.49 |
Modified 32-layer ResNet, CIFAR-100 B0 app. Results for modified 32-layer ResNet
| Method | 5 steps #Paras | 5 steps Avg | 10 steps #Paras | 10 steps Avg | 20 steps #Paras | 20 steps Avg | 50 steps #Paras | 50 steps Avg |
|---|---|---|---|---|---|---|---|---|
| iCaRL | 0.46 | 67.20 | 0.46 | 64.04 | 0.46 | 61.16 | 0.46 | 57.00 |
| BiC | 0.46 | 68.92 | 0.46 | 66.15 | 0.46 | 63.80 | 0.46 | - |
| WA | 0.46 | 70.00 | 0.46 | 67.25 | 0.46 | 64.33 | 0.46 | - |
| DER without pruning | 1.38 | 73.00 | 2.53 | 71.29 | 4.83 | 71.07 | 11.73 | 70.58 |
| DER (with pruning) | 0.42 | 72.31 | 0.52 | 69.41 | 0.45 | 68.82 | 0.70 | 67.29 |
Modified 32-layer ResNet, CIFAR-100 B50 app. Results for modified 32-layer ResNet
| Method | 2 steps #Paras | 2 steps Avg | 5 steps #Paras | 5 steps Avg | 10 steps #Paras | 10 steps Avg |
|---|---|---|---|---|---|---|
| UCIR | 0.46 | 66.76 | 0.46 | 63.42 | 0.46 | 60.18 |
| PODNet | - | - | 0.46 | 64.83 | 0.46 | 64.03 |
| TPCIL | - | - | 0.46 | 65.34 | 0.46 | 63.58 |
| DER without pruning | 0.92 | 70.18 | 1.61 | 68.52 | 2.76 | 67.09 |
| DER (with pruning) | 0.32 | 69.52 | 0.59 | 67.60 | 0.61 | 66.36 |
Other analyses (appendix). Sensitivity to λ_a on CIFAR-100 B0 at 10 steps: 0.1 → 74.12 ± 0.06; 0.5 → 74.41 ± 0.16; 1 → 74.64 ± 0.28; 5 → 74.52 ± 0.33; 10 → 73.54 ± 0.22 app. Sensitive Study of Hyper-parameters. An "ideal" classifier retrained on all past data reaches 76.14 ± 0.80 on that setting, against 74.64 ± 0.28 for DER app. The Quality of Decision Boundary. Inference latency on ImageNet on a GTX 1080Ti is 1.07 ms per image, against 0.99 ms for BiC and WA app. Latency.
Figures, in words. fig. 1 plots average incremental accuracy against model size on CIFAR-100 B0 at 10 steps for WA, BiC, RPSNet, iCaRL, UCIR, PODNet and a jointly trained model. fig. 2 shows the step-t model: frozen extractors Φ_{t-1}^P, the new extractor F_t with learned masks, the concatenated representation, the classifier and the auxiliary head; masks are pruned after training. fig. 3 plots accuracy after each step for CIFAR-100 B0 (20 and 50 steps) and B50 (5 and 10 steps) against the baselines. fig. 4 tracks accuracy on the first class group over steps, as a backward-transfer measure (CIFAR-100 B0, 10 steps).
Paper vs code
The official repository is Rhyssiyan/DER-ClassIL.pytorch, linked from the
paper's footnote on the abstract page §1. It is MIT-licensed
LICENSE. The commit read is dd4af61. The README acknowledges
that it builds on the incremental-learning code base of Douillard et al.
README.md.
- No channel masks, sparsity loss or pruning in the code. The paper's
core expansion method §3.3 and its loss L_S and λ_s eq. 10 eq. 11 are
absent. A search of
inclearn/andcodes/finds no mask, gate or sparsity code. The experiment folders are namedwo_maskandwo_prune1.yaml default.yaml. Only the un-pruned variant (der: True, extractors added and never shrunk) is in the code network.py. The "with pruning" rows of tab. 1 to tab. 3 cannot be reproduced from this repository. - Classifier head is reset at the end of warm-up. The paper says the old
input weights of H_t are inherited from H_{t-1} §3.2. The code resets
the classifier and the auxiliary head when
epoch == warmup_epochsincmodel.py. The DER configs also setreuse_oldfc: False1.yaml, and the inheritance branch only runs when that flag is set network.py. In practice the old head weights are not carried over. - Auxiliary head matches the paper. Its input is only the new extractor's features network.py. Its size is |Y_t|+1 network.py. Targets are 0 for old classes and 1..|Y_t| for new ones incmodel.py. The auxiliary term is added only from the second step incmodel.py. Its weight is fixed at 1 and not a config key, so λ_a is not tunable from configuration.
- New extractor and freezing match the paper. F_t is initialized from
F_{t-1} network.py. Earlier extractors have
requires_grad = Falseand are put in eval mode, which freezes BatchNorm statistics incmodel.py incmodel.py. - Epoch counts differ from the appendix (CIFAR-100). The paper says 160
epochs after a 10-epoch warm-up, with LR decays at 100 and 120 [app.
Hyperparameters]. The config sets
epochs: 170withwarmup_epochs: 10and milestones 100 and 120 1.yaml. The total and warm-up figures agree; the milestone reference point is not stated (see Pitfalls). - Epoch counts differ (ImageNet). The paper says 120 epochs after warm-up,
LR decays at 30, 60, 80 and 90, and the same warm-up as CIFAR-100 (10
epochs) app. Hyperparameters. The ImageNet-100 config sets
epochs: 220,warmup_epochs: 20and milestones 60, 120, 160 and 180 1.yaml. The config is the only ImageNet setting in the repository, so the appendix values cannot be reproduced from it. - Backbone for ImageNet. The paper says an 18-layer ResNet §4.1. The
config uses
preact_resnet181.yaml. - ImageNet-1000 is not in the repository. The README covers ImageNet100 only README.md. No ImageNet-1000 config exists, so tab. 3's ImageNet-1000 column cannot be reproduced from this code.
- Momentum and eval mode are unstated in the paper. SGD momentum is 0.9 for the representation stage factory.py and for the classifier stage utils.py. The classifier stage also runs the whole network in eval mode utils.py.
- Classifier stage matches the paper on the important points. Balanced subset from current data data.py data_utils.py; temperature divides the logits inside cross-entropy utils.py; the head is reset first incmodel.py; 30 epochs, LR 0.1, decay at 15 1.yaml.
- Head re-initialization uses a different init. The classifier stage calls
reset_parameters()on the linear layer, which uses PyTorch's default init incmodel.py. The representation-stage classifier is created with Kaiming normal init network.py. The paper gives no init for either. - Unused config key. The top-level
temperature: 2in the DER configs is assigned but never read incmodel.py. Only the decoupletemperatureis used. - Exemplar selection. The paper states herding for ImageNet only §4.1.
The configs set the
iCaRLcoreset strategy for CIFAR-100 too 1.yaml.
Pitfalls
- Pruning is described, not released. An implementer following the paper must write the masks, the sharpness schedule and the sparsity loss from §3.3 alone. The paper gives no s_max, no mask initialization and no kernel-size convention for L_S beyond eq. 10. Expect the pruned numbers to be unreproducible without the authors' code.
- The ablation numbers are for the un-pruned model. tab. 4's 75.36 (10 steps) equals the "DER without pruning" row of tab. 1, not the headline DER of 74.64 tab. 1. The table does not say pruning is off.
- Classifier reset discards inherited weights. The reset at the end of
warm-up incmodel.py means the paper's
inheritance of H_{t-1} weights §3.2 has little effect even if
reuse_oldfcwere enabled. Decide which you want before implementing. - Milestone reference point is ambiguous. The paper's "after warm-up, 160
epochs, decay at 100 and 120" app. Hyperparameters and the config's
epochs: 170plus milestones 100 and 120 1.yaml can be read as milestones counted from the start of training or after warm-up. ReadingGradualWarmupSchedulerscheduler.py together withset_optimizerincmodel.py suggests the MultiStepLR is stepped only after warm-up. This is a reading of the code, not a tested result. - ImageNet schedule does not match the appendix. 220 epochs with a 20-epoch warm-up and milestones at 60, 120, 160, 180 (config) versus 120 epochs, 10-epoch warm-up and 30, 60, 80, 90 (paper). Use the config if you want to match the repository's ImageNet-100 results; use the paper if you want to match its text. Results were not checked against either here.
- Balanced subset size.
construct_balanced_subsetcuts every class to the smallest class count in whateverdata_incholds data_utils.py. Whether memory exemplars are in that set, and so how many samples each class keeps, was not verified from the code here. - Gain columns use the best baseline per column. Table 1's gain at 5 steps is +2.45 against BiC (73.10), not WA (72.81). Table 2 gains are against BiC at 2 steps and PODNet at 5 and 10 steps tab. 2. Read the baseline name before quoting a gain.
- Forgetting and transfer formulas are ambiguous as typeset. In eq. 12 the minus sign sits outside the inner sum, which as printed covers only A^i_{Y_j}; the intended sum over both terms is not certain. eq. 13 has the same layout eq. 12 eq. 13. Both use an "ideal" classifier trained on all past data to isolate the representation §4.4, which is not deployable.
- λ_s reference in the appendix is wrong. The appendix says λ_s sensitivity is in "Figure 1 in the main body" app. Sensitive Study of Hyper-parameters. Figure 1 is the model-size plot fig. 1, and no λ_s figure appears in the source. The λ_s sensitivity result is not shown in this card.
- Model size grows with steps. The #Paras column (average over steps) rises from 33.6M at 5 steps to 285.6M at 50 steps without pruning, against 11.2M for one ResNet-18 tab. 1. Inference cost grows with the parameter count. The latency table is for ImageNet only app. Latency.
- Old features are fixed after their step. Old extractors never change again. The paper still reports positive backward transfer (+1.36) tab. 5, measured with an ideal classifier, so check whether your task needs the classifier-level result or the representation-level one §4.4.
- ImageNet spread. The text says ImageNet experiments use three class orders §4.1, but tab. 3 has no ± values. Treat ImageNet numbers as single-run unless you rerun them.
- Architecture differs from the code for ImageNet. The paper's "18-layer ResNet" §4.1 is not pinned to a variant. The released ImageNet config uses the pre-activation variant 1.yaml.
Lineage
- Builds on: iCaRL for herding exemplar selection and the class-incremental protocol §4.1; EEIL for the balanced finetuning of the classifier §3.4; HAT for the channel-level mask gating §3.3; the decoupling of representation and classifier learning §1; temperature-scaled softmax §3.4.
- Compared against: iCaRL, UCIR, BiC, WA, PODNet tab. 1 tab. 2; RPSNet §2; TPCIL tab. 2 tab. 3. The closest structure-based methods, RPSNet and CCGN, are discussed in §2 (Discussion).
- Superseded by: not stated in this card.
Source and license
Adapted from “DER: Dynamically Expandable Representation for Class Incremental Learning” by Shipeng Yan, Jiangwei Xie, Xuming He (arXiv:2103.16788), used under CC BY 4.0. Changes: condensed and restructured for implementation, with tables, equations and algorithms taken from the paper and its code, each cited to its source. Not affiliated with or endorsed by the authors. Code citations refer to https://github.com/Rhyssiyan/DER-ClassIL.pytorch at commit dd4af6189910 (MIT). Any quoted code is shown under that license.