Hi Kevin, thanks for your reply. Looks like your __getitem__
function returned a tuple of path and tensor? I saw people using TensorDataset
from Pytorch to create a data bunch: https://gist.github.com/bfarzin/9e94eaa0597b971dda611be4b9735c94, not sure if that’s the only solution.
I’m trying to tile high resolution images into smaller pieces without occupying my hard disk. I used PIL loader to load images and transform them as tensors in my __getitem__
method. My code is mainly copied from this post.
class SegmentedDataset(data.Dataset):
def __init__(self, images, labels, segments_per_image, tfms = transforms.ToTensor()):
self.images = images
self.labels = labels
self.segments_per_image = segments_per_image
self.c = 2
self.tfms = tfms
def get_segment(self, image, segment_ID):
'returns one segment of one image'
image_split1 = image.chunk(2, dim=1)
if segment_ID < 3:
image_split2 = image_split1[0].chunk(2, dim=2)
return image_split2[segment_ID-1]
else:
image_split2 = image_split1[1].chunk(2, dim=2)
return image_split2[segment_ID-3] #pil_loader('/mnt/sdf/training_data/'+image)
def __len__(self):
return len(self.labels)*self.segments_per_image
def __getitem__(self, index):
'Generates one sample of data'
segment_ID = index%self.segments_per_image
image_ID = index//self.segments_per_image
image = self.images[image_ID]
image = pil_loader('/mnt/sdf/training_data/'+image)
image = self.tfms(image)
X = self.get_segment(image, segment_ID)
y = self.labels[image_ID]
return X, y
By running the following code, I end up with the exact same error:
training_set = SegmentedDataset(dfs['filename_new'][0:100], dfs['treatment'][0:100],4)
validation_set = SegmentedDataset(dfs['filename_new'][101:200], dfs['treatment'][101:200],4)
imdata = ImageDataBunch.create(train_ds=training_set, valid_ds=validation_set, path='/mnt/sdf/training_data/')
for xb,yb in imdata.train_dl:
print(xb)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-103-19784011f1ee> in <module>
----> 1 for xb,yb in imdata.train_dl:
2 print(xb)
~/anaconda3/envs/adam/lib/python3.7/site-packages/fastai/basic_data.py in __iter__(self)
73 def __iter__(self):
74 "Process and returns items from `DataLoader`."
---> 75 for b in self.dl: yield self.proc_batch(b)
76
77 @classmethod
~/anaconda3/envs/adam/lib/python3.7/site-packages/fastai/basic_data.py in proc_batch(self, b)
67 def proc_batch(self,b:Tensor)->Tensor:
68 "Process batch `b` of `TensorImage`."
---> 69 b = to_device(b, self.device)
70 for f in listify(self.tfms): b = f(b)
71 return b
~/anaconda3/envs/adam/lib/python3.7/site-packages/fastai/torch_core.py in to_device(b, device)
121 "Recursively put `b` on `device`."
122 device = ifnone(device, defaults.device)
--> 123 return recurse(lambda x: x.to(device, non_blocking=True), b)
124
125 def data_collate(batch:ItemsList)->Tensor:
~/anaconda3/envs/adam/lib/python3.7/site-packages/fastai/core.py in recurse(func, x, *args, **kwargs)
76
77 def recurse(func:Callable, x:Any, *args, **kwargs)->Any:
---> 78 if is_listy(x): return [recurse(func, o, *args, **kwargs) for o in x]
79 if is_dict(x): return {k: recurse(func, v, *args, **kwargs) for k,v in x.items()}
80 return func(x, *args, **kwargs)
~/anaconda3/envs/adam/lib/python3.7/site-packages/fastai/core.py in <listcomp>(.0)
76
77 def recurse(func:Callable, x:Any, *args, **kwargs)->Any:
---> 78 if is_listy(x): return [recurse(func, o, *args, **kwargs) for o in x]
79 if is_dict(x): return {k: recurse(func, v, *args, **kwargs) for k,v in x.items()}
80 return func(x, *args, **kwargs)
~/anaconda3/envs/adam/lib/python3.7/site-packages/fastai/core.py in recurse(func, x, *args, **kwargs)
76
77 def recurse(func:Callable, x:Any, *args, **kwargs)->Any:
---> 78 if is_listy(x): return [recurse(func, o, *args, **kwargs) for o in x]
79 if is_dict(x): return {k: recurse(func, v, *args, **kwargs) for k,v in x.items()}
80 return func(x, *args, **kwargs)
~/anaconda3/envs/adam/lib/python3.7/site-packages/fastai/core.py in <listcomp>(.0)
76
77 def recurse(func:Callable, x:Any, *args, **kwargs)->Any:
---> 78 if is_listy(x): return [recurse(func, o, *args, **kwargs) for o in x]
79 if is_dict(x): return {k: recurse(func, v, *args, **kwargs) for k,v in x.items()}
80 return func(x, *args, **kwargs)
~/anaconda3/envs/adam/lib/python3.7/site-packages/fastai/core.py in recurse(func, x, *args, **kwargs)
78 if is_listy(x): return [recurse(func, o, *args, **kwargs) for o in x]
79 if is_dict(x): return {k: recurse(func, v, *args, **kwargs) for k,v in x.items()}
---> 80 return func(x, *args, **kwargs)
81
82 def first_el(x: Any)->Any:
~/anaconda3/envs/adam/lib/python3.7/site-packages/fastai/torch_core.py in <lambda>(x)
121 "Recursively put `b` on `device`."
122 device = ifnone(device, defaults.device)
--> 123 return recurse(lambda x: x.to(device, non_blocking=True), b)
124
125 def data_collate(batch:ItemsList)->Tensor:
AttributeError: 'str' object has no attribute 'to'