AttributeError: 'str' object has no attribute 'to'

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'