To continue playing detective and continue to learn about the library, I would like to add that I think `is_reg`

is only used in the automated construction of the adaptive pooling head and for the purposes of automatically picking the cost function:

```
11 def get_fc_layers(self):
10 res=[]
9 ni=self.nf
8 for i,nf in enumerate(self.xtra_fc):
7 res += self.create_fc_layer(ni, nf, p=self.ps[i], actn=nn.ReLU())
6 ni=nf
5 final_actn = nn.Sigmoid() if self.is_multi else nn.LogSoftmax()
4 if self.is_reg: final_actn = None
3 res += self.create_fc_layer(ni, self.c, p=self.ps[-1], actn=final_actn)
2 return res
1
```

```
class ConvLearner(Learner):
5 def __init__(self, data, models, precompute=False, **kwargs):
4 self.precompute = False
3 super().__init__(data, models, **kwargs)
2 if hasattr(data, 'is_multi'):
1 self.crit = F.binary_cross_entropy if data.is_multi else F.nll_loss
90 if data.is_reg: self.crit = F.l1_loss
1 elif self.metrics is None:
2 self.metrics = [accuracy_thresh(0.5)] if self.data.is_multi else [accuracy]
3 if precompute: self.save_fc1()
4 self.freeze()
5 self.precompute = precompute
```

So it is the data object that dictates what model we will get out of ConvLearner.pretrained which in turn will call ConvnetBuilder, and what cost function will the constructor for the ConvLearner automatically pick for us.