muellerzr / Practical-Deep-Learning-for-Coders-2.0

Notebooks for the "A walk with fastai2" Study Group and Lecture Series

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Custom get_items function in multilabel notebook causes 'TypeError'

Kshitij09 opened this issue · comments

In the notebook 03_Multi_Label.ipynb, method 3 of DataBlock creation throws
TypeError: unhashable type: 'list'

Complete Traceback for the same is as follows:

TypeError                                 Traceback (most recent call last)

<ipython-input-17-278bfec03875> in <module>()
----> 1 dls = planet.dataloaders(df)
      2 dls.show_batch(max_n=9, figsize=(12,9))

11 frames

/content/fastai2/fastai2/data/block.py in dataloaders(self, source, path, verbose, **kwargs)
     94 
     95     def dataloaders(self, source, path='.', verbose=False, **kwargs):
---> 96         dsets = self.datasets(source)
     97         kwargs = {**self.dls_kwargs, **kwargs, 'verbose': verbose}
     98         return dsets.dataloaders(path=path, after_item=self.item_tfms, after_batch=self.batch_tfms, **kwargs)

/content/fastai2/fastai2/data/block.py in datasets(self, source, verbose)
     91         splits = (self.splitter or RandomSplitter())(items)
     92         pv(f"{len(splits)} datasets of sizes {','.join([str(len(s)) for s in splits])}", verbose)
---> 93         return Datasets(items, tfms=self._combine_type_tfms(), splits=splits, dl_type=self.dl_type, n_inp=self.n_inp, verbose=verbose)
     94 
     95     def dataloaders(self, source, path='.', verbose=False, **kwargs):

/content/fastai2/fastai2/data/core.py in __init__(self, items, tfms, tls, n_inp, dl_type, **kwargs)
    259     def __init__(self, items=None, tfms=None, tls=None, n_inp=None, dl_type=None, **kwargs):
    260         super().__init__(dl_type=dl_type)
--> 261         self.tls = L(tls if tls else [TfmdLists(items, t, **kwargs) for t in L(ifnone(tfms,[None]))])
    262         self.n_inp = (1 if len(self.tls)==1 else len(self.tls)-1) if n_inp is None else n_inp
    263 

/content/fastai2/fastai2/data/core.py in <listcomp>(.0)
    259     def __init__(self, items=None, tfms=None, tls=None, n_inp=None, dl_type=None, **kwargs):
    260         super().__init__(dl_type=dl_type)
--> 261         self.tls = L(tls if tls else [TfmdLists(items, t, **kwargs) for t in L(ifnone(tfms,[None]))])
    262         self.n_inp = (1 if len(self.tls)==1 else len(self.tls)-1) if n_inp is None else n_inp
    263 

/usr/local/lib/python3.6/dist-packages/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

/content/fastai2/fastai2/data/core.py in __init__(self, items, tfms, use_list, do_setup, as_item, split_idx, train_setup, splits, types, verbose)
    200         if do_setup:
    201             pv(f"Setting up {self.tfms}", verbose)
--> 202             self.setup(train_setup=train_setup)
    203 
    204     def _new(self, items, **kwargs): return super()._new(items, tfms=self.tfms, do_setup=False, types=self.types, **kwargs)

/content/fastai2/fastai2/data/core.py in setup(self, train_setup)
    213 
    214     def setup(self, train_setup=True):
--> 215         self.tfms.setup(self, train_setup)
    216         if len(self) != 0:
    217             x = super().__getitem__(0) if self.splits is None else super().__getitem__(self.splits[0])[0]

/usr/local/lib/python3.6/dist-packages/fastcore/transform.py in setup(self, items, train_setup)
    171         tfms = self.fs[:]
    172         self.fs.clear()
--> 173         for t in tfms: self.add(t,items, train_setup)
    174 
    175     def add(self,t, items=None, train_setup=False):

/usr/local/lib/python3.6/dist-packages/fastcore/transform.py in add(self, t, items, train_setup)
    174 
    175     def add(self,t, items=None, train_setup=False):
--> 176         t.setup(items, train_setup)
    177         self.fs.append(t)
    178 

/usr/local/lib/python3.6/dist-packages/fastcore/transform.py in setup(self, items, train_setup)
     66     def setup(self, items=None, train_setup=False):
     67         train_setup = train_setup if self.train_setup is None else self.train_setup
---> 68         return self.setups(getattr(items, 'train', items) if train_setup else items)
     69 
     70     def _call(self, fn, x, split_idx=None, **kwargs):

/usr/local/lib/python3.6/dist-packages/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):

/content/fastai2/fastai2/data/transforms.py in setups(self, dsets)
    200         if self.vocab is None:
    201             vals = set()
--> 202             for b in dsets: vals = vals.union(set(b))
    203             self.vocab = CategoryMap(list(vals), add_na=self.add_na)
    204 

TypeError: unhashable type: 'list'

Thanks! Fixed. It's DataBlock.from_columns

Great!