cellmap_flow.finetune.trainer.supervised
The supervised term of the training loss, and how the model’s output is read for it.
SupervisedLoss builds the criterion loss_type names and compares the
model’s output with the target where it is annotated. output_class_of
says what the output is – a sigmoid baked in, a tanh, or logits – when
nothing declared it, in the classes the model’s server reports
(serving.probe) and as the server finds it, off the network’s graph
first, so that training, ranking and seeding read one model the same way.
The browser’s twin is web/src/finetune/full/loss.ts.
Attributes
Classes
The supervised term: the criterion |
Functions
|
What |
|
What |
Module Contents
- cellmap_flow.finetune.trainer.supervised.logger
- cellmap_flow.finetune.trainer.supervised.output_class_of(model_config, model, example, select_channel=None) str
What
model’s output is, as its inference server finds it: offmodel_config’s network graph (ModelConfig.output_graph,portable.activation: the op that ends it), elseprobe_output_class. The graph is the model the job was built from; an adapter or new weights change neither the op its network ends in nor the channel read.The graph first, as the probe can mislead: a network that ends in a convolution can answer it with values inside [-1, 1] (one value everywhere, even), which read as a tanh’s output.
- cellmap_flow.finetune.trainer.supervised.probe_output_class(model, example, select_channel=None) str
What
model’s output is – unit, signed_unit or unbounded (serving.probe) – read off its answer to an extreme input.exampleis an input batch of the shape the model takes; the probe is noise of that shape at 100x, so that an output bounded by a sigmoid or a tanh shows its bounds and logits show their range.select_channelreads the channel training compares. The model is probed in eval mode and left as it was: in train mode a full finetune’s BatchNorm took the noise into its running statistics – about 7,000x on every channel, which takes ~85 batches to decay, longer than most interactive runs – and the export and the served model normalize by them. A probe that fails reads as logits, with a warning.
- class cellmap_flow.finetune.trainer.supervised.SupervisedLoss(options, target_transform=None)
The supervised term: the criterion
options.loss_typenames, compared with the target where it is annotated.What the criterion sees depends on what the model’s output is (
options.output_class): probabilities when it is bounded – a sigmoid or a tanh baked in, where a second sigmoid would squash [0, 1] into [0.5, 0.73] and make a well-fitting prediction look like a constant – so BCE-with-logits becomes BCE and Dice and margin skip their sigmoid; logits otherwise (losses.as_probabilities). MSE always compares probabilities with the 0/1 target, as dice and margin do: on a logit model it used to compare the raw logits, training them toward 0 and 1, which the served sigmoid turns into 0.5 and 0.73, wrecking any threshold. The interval loss bounds the logit, where a distance field is a line; the flow loss reads flows and a logit as the model emits them, whatever the probe said (its flows can fall within [0, 1]).Label smoothing is redundant with the margin loss and means nothing to bounds, flows or a soft distance target, so it is 0 for those; class balancing does not apply to the flow loss.
targetsmakes a batch’s target, mask and bounds from its annotation; the call computes the term and keeps the step’s metrics (the interval terms; on BCE the target’s entropy floor and the mean |p - t|), whichtallysums over the epoch’s supervised batches.- loss_type
- margin
- balance_classes
- label_smoothing
- mask_unannotated
- target_transform = None
- use_bce
- use_mse
- use_interval
- use_flow
- output_class = 'unbounded'
- takes_probabilities
- step_interval_terms = None
- step_bce_metrics = None
- targets(annotation)
A batch’s
(target, mask, bounds, hard_target)from its annotation.The target transform’s target and mask; for the interval loss the target is the bounds, and the painted class stands in as the target for the class check, the class balance and the TensorBoard image. Without a transform, the legacy reading: 0 unannotated, 1 background, 2 foreground, shifted down by one, and masked when mask_unannotated.
hard_targetis the target as annotated: class balancing splits voxels into fg and bg by it, before smoothing – split by the smoothed target, every bg voxel carried s/2 of fg weight (with 100 fg voxels against 100k bg at s = 0.1, 98% of the “fg” half of the loss was bg). Smoothing then moves 0 to s/2 and 1 to 1 - s/2.
- reset_epoch()
- tally()
Add the last step’s BCE metrics to the epoch’s; for a step that had supervised voxels.