TTA doesn't work in python script

Hi,

i am trying to use learn.tta() in a python script (not in a notebook) and can’t get it to work. In a notebook it actually works fine.

Thats the code that I am using:

def get_predictions(imgs=None, tta=False):
    dl = learn.dls.test_dl(imgs)
    if tta:
        preds,_ = learn.tta(dl=dl)
    else:
        preds,_ = learn.get_preds(dl=dl)
    
    dec_preds = [np.argmax(p) for p in preds.tolist()]
    labels = [learn.dls.vocab[pred] for pred in dec_preds]
    probabilities = [np.max(p) for p in preds.tolist()]

    return labels, probabilities

stack trace:

Traceback (most recent call last):                                                                                             
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastai2/learner.py", line 174, in _do_epoch_validate
    self.dl = dl;                                    self('begin_validate')
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastai2/learner.py", line 124, in __call__
    def __call__(self, event_name): L(event_name).map(self._call_one)
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastcore/foundation.py", line 372, in map
    return self._new(map(g, self))
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastcore/foundation.py", line 323, in _new
    def _new(self, items, *args, **kwargs): return type(self)(items, *args, use_list=None, **kwargs)
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastcore/foundation.py", line 41, in __call__
    res = super().__call__(*((x,) + args), **kwargs)
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastcore/foundation.py", line 314, in __init__
    items = list(items) if use_list else _listify(items)
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastcore/foundation.py", line 250, in _listify
    if is_iter(o): return list(o)
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastcore/foundation.py", line 216, in __call__
    return self.fn(*fargs, **kwargs)
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastai2/learner.py", line 127, in _call_one
    [cb(event_name) for cb in sort_by_run(self.cbs)]
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastai2/learner.py", line 127, in <listcomp>
    [cb(event_name) for cb in sort_by_run(self.cbs)]
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastai2/callback/core.py", line 24, in __call__
    if self.run and _run: getattr(self, event_name, noop)()
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastai2/callback/progress.py", line 26, in begin_validate
    def begin_validate(self): self._launch_pbar()
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastai2/callback/progress.py", line 34, in _launch_pbar
    self.pbar = progress_bar(self.dl, parent=getattr(self, 'mbar', None), leave=False)
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastprogress/fastprogress.py", line 226, in __init__
    super().__init__(gen, total, display, leave, parent, master)
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastprogress/fastprogress.py", line 24, in __init__
    parent.add_child(self)
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastprogress/fastprogress.py", line 264, in add_child
    self.child.prefix = f'Epoch {self.main_bar.last_v+1}/{self.main_bar.total} :'
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/florian/projects/fastai2-serving/_test/sort_local.py", line 56, in <module>
    l,p = get_predictions(imgs=images, tta=True)
  File "/Users/florian/projects/fastai2-serving/_test/sort_local.py", line 23, in get_predictions
    preds,_ = learn.tta(dl=dl)
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastai2/learner.py", line 528, in tta
    with dl.dataset.set_split_idx(1): preds,targs = self.get_preds(dl=dl, inner=True)
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastai2/learner.py", line 219, in get_preds
    self._do_epoch_validate(dl=dl)
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastai2/learner.py", line 178, in _do_epoch_validate
    dl,*_ = change_attrs(dl, names, old, has);       self('after_validate')
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastai2/learner.py", line 124, in __call__
    def __call__(self, event_name): L(event_name).map(self._call_one)
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastcore/foundation.py", line 372, in map
    return self._new(map(g, self))
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastcore/foundation.py", line 323, in _new
    def _new(self, items, *args, **kwargs): return type(self)(items, *args, use_list=None, **kwargs)
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastcore/foundation.py", line 41, in __call__
    res = super().__call__(*((x,) + args), **kwargs)
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastcore/foundation.py", line 314, in __init__
    items = list(items) if use_list else _listify(items)
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastcore/foundation.py", line 250, in _listify
    if is_iter(o): return list(o)
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastcore/foundation.py", line 216, in __call__
    return self.fn(*fargs, **kwargs)
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastai2/learner.py", line 127, in _call_one
    [cb(event_name) for cb in sort_by_run(self.cbs)]
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastai2/learner.py", line 127, in <listcomp>
    [cb(event_name) for cb in sort_by_run(self.cbs)]
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastai2/callback/core.py", line 24, in __call__
    if self.run and _run: getattr(self, event_name, noop)()
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastai2/callback/core.py", line 96, in after_validate
    if not self.save_preds: self.preds   = detuplify(to_concat(self.preds, dim=self.concat_dim))
  File "/Users/florian/miniconda3/envs/fastai2/lib/python3.7/site-packages/fastcore/foundation.py", line 230, in __getattr__
    if attr is not None: return getattr(attr,k)
AttributeError: 'Learner' object has no attribute 'preds'
1 Like

so I tried this in a docker image because to exclude the possibility that there’s an issue with my environment on my Mac. I get exactly the same error. @sgugger could you please have a quick look if that’s maybe a bug or if I do something wrong here?

As far as I can see learn.tta() works only in a notebook but not in a .py script.

Thank you
Florian

It was a bug in fatprogress, should be fixed (you will need an editable install of it to get the latest).

1 Like

tta() works now in scripts. Thank you!