fastai / fastai2

Temporary home for fastai v2 while it's being developed
https://dev.fast.ai
Apache License 2.0
645 stars 235 forks source link

nbs/22_tutorial.imagenette broken, error in foundation.py #124

Closed mprostock closed 4 years ago

mprostock commented 4 years ago

Not sure whether this is expected, first steps with v2. Absolutely fresh conda install, everything according to readmes, pip -e installs of both fastai2 and fastcore. Zero changes to anything, everything fresh out of the box.

When running the 22_tutorial.imagenette notebook, everything up to and including training with fit works fine, but fails afterwards for: t = learn.predict(tst_item) with error:

/Data/Code/fastai/fastcore/fastcore/foundation.py in _get(self, i)
    318 
    319     def _get(self, i):
--> 320         if is_indexer(i) or isinstance(i,slice): return getattr(self.items,'iloc',self.items)[i]
    321         i = mask2idxs(i)
    322         return (self.items.iloc[list(i)] if hasattr(self.items,'iloc')

IndexError: list index out of range

full stacktrace below this message.

last commit fastai2 master:

commit 9f84496b5b324fc8b1104028fcd25ad62e7673f4 (HEAD -> master, origin/master, origin/HEAD)
Merge: f71dc53 096d8c1
Author: Jeremy Howard <j@fast.ai>
Date:   Sat Feb 22 18:03:20 2020 -0800

last commit fastcore:

Merge: 1975158 f561528
Author: Sylvain Gugger <35901082+sgugger@users.noreply.github.com>
Date:   Fri Feb 21 09:13:00 2020 -0800

pytorch version (as installed by requirements.yml): pytorch 1.4.0 (py3.7_cuda10.1.243_cudnn7.6.3_0 pytorch)

Full stacktrace:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-17-c05f4d4525e2> in <module>
----> 1 t = learn.predict(tst_item)

/Data/Code/fastai/fastai2/fastai2/learner.py in predict(self, item, rm_type_tfms, with_input)
    214         dl = self.dls.test_dl([item], rm_type_tfms=rm_type_tfms)
    215         inp,preds,_,dec_preds = self.get_preds(dl=dl, with_input=True, with_decoded=True)
--> 216         dec = self.dls.decode_batch((*tuplify(inp),*tuplify(dec_preds)))[0]
    217         i = getattr(self.dls, 'n_inp', -1)
    218         dec_inp,dec_targ = map(detuplify, [dec[:i],dec[i:]])

/Data/Code/fastai/fastai2/fastai2/data/core.py in decode_batch(self, b, max_n, full)
     72 
     73     def decode(self, b): return self.before_batch.decode(to_cpu(self.after_batch.decode(self._retain_dl(b))))
---> 74     def decode_batch(self, b, max_n=9, full=True): return self._decode_batch(self.decode(b), max_n, full)
     75 
     76     def _decode_batch(self, b, max_n=9, full=True):

/Data/Code/fastai/fastai2/fastai2/data/core.py in _decode_batch(self, b, max_n, full)
     77         f = self.after_item.decode
     78         f = compose(f, partial(getattr(self.dataset,'decode',noop), full = full))
---> 79         return L(batch_to_samples(b, max_n=max_n)).map(f)
     80 
     81     def _pre_show_batch(self, b, max_n=9):

/Data/Code/fastai/fastcore/fastcore/foundation.py in map(self, f, *args, **kwargs)
    360              else f.format if isinstance(f,str)
    361              else f.__getitem__)
--> 362         return self._new(map(g, self))
    363 
    364     def filter(self, f, negate=False, **kwargs):

/Data/Code/fastai/fastcore/fastcore/foundation.py in _new(self, items, *args, **kwargs)
    313     @property
    314     def _xtra(self): return None
--> 315     def _new(self, items, *args, **kwargs): return type(self)(items, *args, use_list=None, **kwargs)
    316     def __getitem__(self, idx): return self._get(idx) if is_indexer(idx) else L(self._get(idx), use_list=None)
    317     def copy(self): return self._new(self.items.copy())

/Data/Code/fastai/fastcore/fastcore/foundation.py in __call__(cls, x, *args, **kwargs)
     39             return x
     40 
---> 41         res = super().__call__(*((x,) + args), **kwargs)
     42         res._newchk = 0
     43         return res

/Data/Code/fastai/fastcore/fastcore/foundation.py in __init__(self, items, use_list, match, *rest)
    304         if items is None: items = []
    305         if (use_list is not None) or not _is_array(items):
--> 306             items = list(items) if use_list else _listify(items)
    307         if match is not None:
    308             if is_coll(match): match = len(match)

/Data/Code/fastai/fastcore/fastcore/foundation.py in _listify(o)
    240     if isinstance(o, list): return o
    241     if isinstance(o, str) or _is_array(o): return [o]
--> 242     if is_iter(o): return list(o)
    243     return [o]
    244 

/Data/Code/fastai/fastcore/fastcore/foundation.py in __call__(self, *args, **kwargs)
    206             if isinstance(v,_Arg): kwargs[k] = args.pop(v.i)
    207         fargs = [args[x.i] if isinstance(x, _Arg) else x for x in self.pargs] + args[self.maxi+1:]
--> 208         return self.fn(*fargs, **kwargs)
    209 
    210 # Cell

/Data/Code/fastai/fastcore/fastcore/utils.py in _inner(x, *args, **kwargs)
    339     if order is not None: funcs = funcs.sorted(order)
    340     def _inner(x, *args, **kwargs):
--> 341         for f in L(funcs): x = f(x, *args, **kwargs)
    342         return x
    343     return _inner

/Data/Code/fastai/fastai2/fastai2/data/core.py in decode(self, o, full)
    271     def __iter__(self): return (self[i] for i in range(len(self)))
    272     def __repr__(self): return coll_repr(self)
--> 273     def decode(self, o, full=True): return tuple(tl.decode(o_, full=full) for o_,tl in zip(o,tuplify(self.tls, match=o)))
    274     def subset(self, i): return type(self)(tls=L(tl.subset(i) for tl in self.tls), n_inp=self.n_inp)
    275     def _new(self, items, *args, **kwargs): return super()._new(items, tfms=self.tfms, do_setup=False, **kwargs)

/Data/Code/fastai/fastai2/fastai2/data/core.py in <genexpr>(.0)
    271     def __iter__(self): return (self[i] for i in range(len(self)))
    272     def __repr__(self): return coll_repr(self)
--> 273     def decode(self, o, full=True): return tuple(tl.decode(o_, full=full) for o_,tl in zip(o,tuplify(self.tls, match=o)))
    274     def subset(self, i): return type(self)(tls=L(tl.subset(i) for tl in self.tls), n_inp=self.n_inp)
    275     def _new(self, items, *args, **kwargs): return super()._new(items, tfms=self.tfms, do_setup=False, **kwargs)

/Data/Code/fastai/fastai2/fastai2/data/core.py in decode(self, o, **kwargs)
    208     def __iter__(self): return (self[i] for i in range(len(self)))
    209     def show(self, o, **kwargs): return self.tfms.show(o, **kwargs)
--> 210     def decode(self, o, **kwargs): return self.tfms.decode(o, **kwargs)
    211     def __call__(self, o, **kwargs): return self.tfms.__call__(o, **kwargs)
    212     def overlapping_splits(self): return L(Counter(self.splits.concat()).values()).filter(gt(1))

/Data/Code/fastai/fastcore/fastcore/transform.py in decode(self, o, full)
    191 
    192     def decode  (self, o, full=True):
--> 193         if full: return compose_tfms(o, tfms=self.fs, is_enc=False, reverse=True, split_idx=self.split_idx)
    194         #Not full means we decode up to the point the item knows how to show itself.
    195         for f in reversed(self.fs):

/Data/Code/fastai/fastcore/fastcore/transform.py in compose_tfms(x, tfms, is_enc, reverse, **kwargs)
    136     for f in tfms:
    137         if not is_enc: f = f.decode
--> 138         x = f(x, **kwargs)
    139     return x
    140 

/Data/Code/fastai/fastcore/fastcore/transform.py in decode(self, x, **kwargs)
     71     def name(self): return getattr(self, '_name', _get_name(self))
     72     def __call__(self, x, **kwargs): return self._call('encodes', x, **kwargs)
---> 73     def decode  (self, x, **kwargs): return self._call('decodes', x, **kwargs)
     74     def __repr__(self): return f'{self.name}: {self.encodes} {self.decodes}'
     75 

/Data/Code/fastai/fastcore/fastcore/transform.py in _call(self, fn, x, split_idx, **kwargs)
     81         if split_idx!=self.split_idx and self.split_idx is not None: return x
     82         f = getattr(self, fn)
---> 83         if not _is_tuple(x): return self._do_call(f, x, **kwargs)
     84         res = tuple(self._do_call(f, x_, **kwargs) for x_ in x)
     85         return retain_type(res, x)

/Data/Code/fastai/fastcore/fastcore/transform.py in _do_call(self, f, x, **kwargs)
     86 
     87     def _do_call(self, f, x, **kwargs):
---> 88         return x if f is None else retain_type(f(x, **kwargs), x, f.returns_none(x))
     89 
     90 add_docs(Transform, decode="Delegate to `decodes` to undo transform", setup="Delegate to `setups` to set up transform")

/Data/Code/fastai/fastcore/fastcore/dispatch.py in __call__(self, *args, **kwargs)
     96         if not f: return args[0]
     97         if self.inst is not None: f = MethodType(f, self.inst)
---> 98         return f(*args, **kwargs)
     99 
    100     def __get__(self, inst, owner):

/Data/Code/fastai/fastai2/fastai2/data/transforms.py in decodes(self, o)
    198 
    199     def encodes(self, o): return TensorCategory(self.vocab.o2i[o])
--> 200     def decodes(self, o): return Category      (self.vocab    [o])
    201 
    202 # Cell

/Data/Code/fastai/fastcore/fastcore/foundation.py in __getitem__(self, k)
    268     def __init__(self, items): self.items = items
    269     def __len__(self): return len(self.items)
--> 270     def __getitem__(self, k): return self.items[k]
    271     def __setitem__(self, k, v): self.items[list(k) if isinstance(k,CollBase) else k] = v
    272     def __delitem__(self, i): del(self.items[i])

/Data/Code/fastai/fastcore/fastcore/foundation.py in __getitem__(self, idx)
    314     def _xtra(self): return None
    315     def _new(self, items, *args, **kwargs): return type(self)(items, *args, use_list=None, **kwargs)
--> 316     def __getitem__(self, idx): return self._get(idx) if is_indexer(idx) else L(self._get(idx), use_list=None)
    317     def copy(self): return self._new(self.items.copy())
    318 

/Data/Code/fastai/fastcore/fastcore/foundation.py in _get(self, i)
    318 
    319     def _get(self, i):
--> 320         if is_indexer(i) or isinstance(i,slice): return getattr(self.items,'iloc',self.items)[i]
    321         i = mask2idxs(i)
    322         return (self.items.iloc[list(i)] if hasattr(self.items,'iloc')

IndexError: list index out of range
sgugger commented 4 years ago

It's a problem in LabelSmoothingCrossEntropy. Will fix later today, for now removed it of the tutorial and it works. Thanks for flagging!