How can I get a Dataset from the SiamesePair pipeline example in https://github.com/fastai/fastai2/blob/master/nbs/10_tutorial.pets.ipynb?
I tried:
OpenAndResize = TupleTransform(resized_image)
labeller = RegexLabeller(pat = r'/([^/]+)_\d+.jpg$')
sp = SiamesePair(items, items.map(labeller))
pipe = Pipeline([sp, OpenAndResize], as_item=True)
dsets = Datasets(items, pipe)
t = dsets[0]
type(t[0]),type(t[1])
getting error:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-66-cab6cdc85da8> in <module>
4 pipe = Pipeline([sp, OpenAndResize], as_item=True)
5 dsets = Datasets(items, pipe)
----> 6 t = dsets[0]
7 type(t[0]),type(t[1])
~/Dev/fastai2/fastai2/data/core.py in __getitem__(self, it)
255
256 def __getitem__(self, it):
--> 257 res = tuple([tl[it] for tl in self.tls])
258 return res if is_indexer(it) else list(zip(*res))
259
~/Dev/fastai2/fastai2/data/core.py in <listcomp>(.0)
255
256 def __getitem__(self, it):
--> 257 res = tuple([tl[it] for tl in self.tls])
258 return res if is_indexer(it) else list(zip(*res))
259
~/Dev/fastai2/fastai2/data/core.py in __getitem__(self, idx)
232 res = super().__getitem__(idx)
233 if self._after_item is None: return res
--> 234 return self._after_item(res) if is_indexer(idx) else res.map(self._after_item)
235
236 # Cell
~/Dev/fastai2/fastai2/data/core.py in _after_item(self, o)
196 def _new(self, items, **kwargs): return super()._new(items, tfms=self.tfms, do_setup=False, types=self.types, **kwargs)
197 def subset(self, i): return self._new(self._get(self.splits[i]), split_idx=i)
--> 198 def _after_item(self, o): return self.tfms(o)
199 def __repr__(self): return f"{self.__class__.__name__}: {self.items}\ntfms - {self.tfms.fs}"
200 def __iter__(self): return (self[i] for i in range(len(self)))
~/Dev/fastcore/fastcore/transform.py in __call__(self, o)
186 self.fs.append(t)
187
--> 188 def __call__(self, o): return compose_tfms(o, tfms=self.fs, split_idx=self.split_idx)
189 def __repr__(self): return f"Pipeline: {' -> '.join([f.name for f in self.fs if f.name != 'noop'])}"
190 def __getitem__(self,i): return self.fs[i]
~/Dev/fastcore/fastcore/transform.py in compose_tfms(x, tfms, is_enc, reverse, **kwargs)
134 for f in tfms:
135 if not is_enc: f = f.decode
--> 136 x = f(x, **kwargs)
137 return x
138
~/Dev/fastcore/fastcore/transform.py in __call__(self, x, **kwargs)
69 @property
70 def name(self): return getattr(self, '_name', _get_name(self))
---> 71 def __call__(self, x, **kwargs): return self._call('encodes', x, **kwargs)
72 def decode (self, x, **kwargs): return self._call('decodes', x, **kwargs)
73 def __repr__(self): return f'{self.name}: {self.use_as_item} {self.encodes} {self.decodes}'
~/Dev/fastcore/fastcore/transform.py in _call(self, fn, x, split_idx, **kwargs)
80 if split_idx!=self.split_idx and self.split_idx is not None: return x
81 f = getattr(self, fn)
---> 82 if self.use_as_item or not is_listy(x): return self._do_call(f, x, **kwargs)
83 res = tuple(self._do_call(f, x_, **kwargs) for x_ in x)
84 return retain_type(res, x)
~/Dev/fastcore/fastcore/transform.py in _do_call(self, f, x, **kwargs)
85
86 def _do_call(self, f, x, **kwargs):
---> 87 return x if f is None else retain_type(f(x, **kwargs), x, f.returns_none(x))
88
89 add_docs(Transform, decode="Delegate to `decodes` to undo transform", setup="Delegate to `setups` to set up transform")
~/Dev/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):
<ipython-input-63-605ff57d4e17> in encodes(self, i)
11 othercls = self.clsmap[self.labels[i]] if random.random()>0.5 else self.idxs
12 otherit = random.choice(othercls)
---> 13 return SiameseImage(self.items[i], self.items[otherit], self.labels[otherit]==self.labels[i])
~/Dev/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
~/Dev/fastcore/fastcore/foundation.py in _get(self, i)
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')
323 else self.items.__array__()[(i,)] if hasattr(self.items,'__array__')
~/Dev/fastcore/fastcore/foundation.py in mask2idxs(mask)
253 "Convert bool mask or index list to index `L`"
254 if isinstance(mask,slice): return mask
--> 255 mask = list(mask)
256 if len(mask)==0: return []
257 it = mask[0]
TypeError: 'PosixPath' object is not iterable