Hello All,
I have been trying to build an auto-encoder in fastai and have stumbled upon this issue where if you pass a pandas dataframe to a datablock with two ImageBlocks it fails. When I don’t use a pandas dataframe it works fine.
From what I can tell it looks like the data is being push to pytorch default_collate.
Is there anything I can do to fix this? Should I be passing less info in the pandas dataframe?
Any help would be appreciated
nav = DataBlock(
blocks = (ImageBlock, ImageBlock),
get_x = ColReader(cols='image', pref=''),
get_y = None,
splitter = ColSplitter('validation_set'),
)
dls = nav.dataloaders(df, bs=256)
print(dls.train_ds[0])
dls._one_pass()
print(len(dls.train_ds))
print(len(dls.valid_ds))
This returns this:
Could not do one pass in your dataloader, there is something wrong in it
(PILImage mode=RGB size=160x120, Unnamed: 0 0
image data/Andrew Kew traffic School/tub_11_19-11-03/1_cam-image_array_.jpg
angle -0.0290122
throttle 0.00852259
validation_set False
test_set False
Name: 0, dtype: object)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-9-d4392ee899fc> in <module>
9
10 print(dls.train_ds[0])
---> 11 dls._one_pass()
12 print(len(dls.train_ds))
13 print(len(dls.valid_ds))
~/anaconda3/envs/fastai2/lib/python3.8/site-packages/fastai/data/core.py in _one_pass(self)
49
50 def _one_pass(self):
---> 51 b = self.do_batch([self.do_item(0)])
52 if self.device is not None: b = to_device(b, self.device)
53 its = self.after_batch(b)
~/anaconda3/envs/fastai2/lib/python3.8/site-packages/fastai/data/load.py in do_batch(self, b)
131 def create_item(self, s): return next(self.it) if s is None else self.dataset[s]
132 def create_batch(self, b): return (fa_collate,fa_convert)[self.prebatched](b)
--> 133 def do_batch(self, b): return self.retain(self.create_batch(self.before_batch(b)), b)
134 def to(self, device): self.device = device
135 def one_batch(self):
~/anaconda3/envs/fastai2/lib/python3.8/site-packages/fastai/data/load.py in create_batch(self, b)
130 def retain(self, res, b): return retain_types(res, b[0] if is_listy(b) else b)
131 def create_item(self, s): return next(self.it) if s is None else self.dataset[s]
--> 132 def create_batch(self, b): return (fa_collate,fa_convert)[self.prebatched](b)
133 def do_batch(self, b): return self.retain(self.create_batch(self.before_batch(b)), b)
134 def to(self, device): self.device = device
~/anaconda3/envs/fastai2/lib/python3.8/site-packages/fastai/data/load.py in fa_collate(t)
46 b = t[0]
47 return (default_collate(t) if isinstance(b, _collate_types)
---> 48 else type(t[0])([fa_collate(s) for s in zip(*t)]) if isinstance(b, Sequence)
49 else default_collate(t))
50
~/anaconda3/envs/fastai2/lib/python3.8/site-packages/fastai/data/load.py in <listcomp>(.0)
46 b = t[0]
47 return (default_collate(t) if isinstance(b, _collate_types)
---> 48 else type(t[0])([fa_collate(s) for s in zip(*t)]) if isinstance(b, Sequence)
49 else default_collate(t))
50
~/anaconda3/envs/fastai2/lib/python3.8/site-packages/fastai/data/load.py in fa_collate(t)
47 return (default_collate(t) if isinstance(b, _collate_types)
48 else type(t[0])([fa_collate(s) for s in zip(*t)]) if isinstance(b, Sequence)
---> 49 else default_collate(t))
50
51 # Cell
~/anaconda3/envs/fastai2/lib/python3.8/site-packages/torch/utils/data/_utils/collate.py in default_collate(batch)
83 return [default_collate(samples) for samples in transposed]
84
---> 85 raise TypeError(default_collate_err_msg_format.format(elem_type))
TypeError: default_collate: batch must contain tensors, numpy arrays, numbers, dicts or lists; found <class 'pandas.core.series.Series'>