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!