RuntimeError: "adaptive_avg_pool2d_cpu" not implemented for 'Byte'

There’s something really weird going on when I try to create a dataBunch from a single image.
I’m gona post the code and errors in the exactly order their appear:

When i first type data, everything is all right. But after doing

 imb, _ = data.one_item(im, detach=False, denorm=False) ; imb 

I try to get data again, we get an error.

What’s happening? Why imb, _ = data.one_item(im, detach=False, denorm=False) ; imb doesnt work and why it is breaking data?

Thanks

Can you share the full stack trace of the error ?

1 Like

Sure.
For imb, _ = data.one_item(im, detach=False, denorm=False) ; imb it is:

RuntimeError                              Traceback (most recent call last)
<ipython-input-16-ff4fc946a627> in <module>
----> 1 imb, _ = data.one_item(im, detach=False, denorm=False) ; imb

~\Anaconda3\envs\fastaienv\lib\site-packages\fastai\basic_data.py in one_item(self, item, detach, denorm, cpu)
    179         ds = self.single_ds
    180         with ds.set_item(item):
--> 181             return self.one_batch(ds_type=DatasetType.Single, detach=detach, denorm=denorm, cpu=cpu)
    182 
    183     def show_batch(self, rows:int=5, ds_type:DatasetType=DatasetType.Train, reverse:bool=False, **kwargs)->None:

~\Anaconda3\envs\fastaienv\lib\site-packages\fastai\basic_data.py in one_batch(self, ds_type, detach, denorm, cpu)
    166         w = self.num_workers
    167         self.num_workers = 0
--> 168         try:     x,y = next(iter(dl))
    169         finally: self.num_workers = w
    170         if detach: x,y = to_detach(x,cpu=cpu),to_detach(y,cpu=cpu)

~\Anaconda3\envs\fastaienv\lib\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\fastaienv\lib\site-packages\torch\utils\data\dataloader.py in __next__(self)
    558         if self.num_workers == 0:  # same-process loading
    559             indices = next(self.sample_iter)  # may raise StopIteration
--> 560             batch = self.collate_fn([self.dataset[i] for i in indices])
    561             if self.pin_memory:
    562                 batch = _utils.pin_memory.pin_memory_batch(batch)

~\Anaconda3\envs\fastaienv\lib\site-packages\torch\utils\data\dataloader.py in <listcomp>(.0)
    558         if self.num_workers == 0:  # same-process loading
    559             indices = next(self.sample_iter)  # may raise StopIteration
--> 560             batch = self.collate_fn([self.dataset[i] for i in indices])
    561             if self.pin_memory:
    562                 batch = _utils.pin_memory.pin_memory_batch(batch)

~\Anaconda3\envs\fastaienv\lib\site-packages\fastai\data_block.py in __getitem__(self, idxs)
    649             else:                 x,y = self.item   ,0
    650             if self.tfms or self.tfmargs:
--> 651                 x = x.apply_tfms(self.tfms, **self.tfmargs)
    652             if hasattr(self, 'tfms_y') and self.tfm_y and self.item is None:
    653                 y = y.apply_tfms(self.tfms_y, **{**self.tfmargs_y, 'do_resolve':False})

~\Anaconda3\envs\fastaienv\lib\site-packages\fastai\vision\image.py in apply_tfms(self, tfms, do_resolve, xtra, size, resize_method, mult, padding_mode, mode, remove_out)
    120             elif tfm in size_tfms:
    121                 if resize_method in (ResizeMethod.CROP,ResizeMethod.PAD):
--> 122                     x = tfm(x, size=_get_crop_target(size,mult=mult), padding_mode=padding_mode)
    123             else: x = tfm(x)
    124         return x.refresh()

~\Anaconda3\envs\fastaienv\lib\site-packages\fastai\vision\image.py in __call__(self, x, *args, **kwargs)
    516     def __call__(self, x:Image, *args, **kwargs)->Image:
    517         "Randomly execute our tfm on `x`."
--> 518         return self.tfm(x, *args, **{**self.resolved, **kwargs}) if self.do_run else x
    519 
    520 def _resolve_tfms(tfms:TfmList):

~\Anaconda3\envs\fastaienv\lib\site-packages\fastai\vision\image.py in __call__(self, p, is_random, use_on_y, *args, **kwargs)
    462     def __call__(self, *args:Any, p:float=1., is_random:bool=True, use_on_y:bool=True, **kwargs:Any)->Image:
    463         "Calc now if `args` passed; else create a transform called prob `p` if `random`."
--> 464         if args: return self.calc(*args, **kwargs)
    465         else: return RandTransform(self, kwargs=kwargs, is_random=is_random, use_on_y=use_on_y, p=p)
    466 

~\Anaconda3\envs\fastaienv\lib\site-packages\fastai\vision\image.py in calc(self, x, *args, **kwargs)
    467     def calc(self, x:Image, *args:Any, **kwargs:Any)->Image:
    468         "Apply to image `x`, wrapping it if necessary."
--> 469         if self._wrap: return getattr(x, self._wrap)(self.func, *args, **kwargs)
    470         else:          return self.func(x, *args, **kwargs)
    471 

~\Anaconda3\envs\fastaienv\lib\site-packages\fastai\vision\image.py in pixel(self, func, *args, **kwargs)
    170     def pixel(self, func:PixelFunc, *args, **kwargs)->'Image':
    171         "Equivalent to `image.px = func(image.px)`."
--> 172         self.px = func(self.px, *args, **kwargs)
    173         return self
    174 

~\Anaconda3\envs\fastaienv\lib\site-packages\fastai\vision\image.py in px(self)
    143     def px(self)->TensorImage:
    144         "Get the tensor pixel buffer."
--> 145         self.refresh()
    146         return self._px
    147     @px.setter

~\Anaconda3\envs\fastaienv\lib\site-packages\fastai\vision\image.py in refresh(self)
    130             self._logit_px = None
    131         if self._affine_mat is not None or self._flow is not None:
--> 132             self._px = _grid_sample(self._px, self.flow, **self.sample_kwargs)
    133             self.sample_kwargs = {}
    134             self._flow = None

~\Anaconda3\envs\fastaienv\lib\site-packages\fastai\vision\image.py in _grid_sample(x, coords, mode, padding_mode, remove_out)
    532         d = min(x.shape[1]/coords.shape[1], x.shape[2]/coords.shape[2])/2
    533         # If we're resizing up by >200%, and we're zooming less than that, interpolate first
--> 534         if d>1 and d>z: x = F.interpolate(x[None], scale_factor=1/d, mode='area')[0]
    535     return F.grid_sample(x[None], coords, mode=mode, padding_mode=padding_mode)[0]
    536 

~\Anaconda3\envs\fastaienv\lib\site-packages\torch\nn\functional.py in interpolate(input, size, scale_factor, mode, align_corners)
   2549         return adaptive_avg_pool1d(input, _output_size(1))
   2550     elif input.dim() == 4 and mode == 'area':
-> 2551         return adaptive_avg_pool2d(input, _output_size(2))
   2552     elif input.dim() == 5 and mode == 'area':
   2553         return adaptive_avg_pool3d(input, _output_size(3))

~\Anaconda3\envs\fastaienv\lib\site-packages\torch\nn\functional.py in adaptive_avg_pool2d(input, output_size)
    787     """
    788     _output_size = _list_with_default(output_size, input.size())
--> 789     return torch._C._nn.adaptive_avg_pool2d(input, _output_size)
    790 
    791 

RuntimeError: "adaptive_avg_pool2d_cpu" not implemented for 'Byte'

and for data it is:

RuntimeError                              Traceback (most recent call last)
~\Anaconda3\envs\fastaienv\lib\site-packages\IPython\core\formatters.py in __call__(self, obj)
    700                 type_pprinters=self.type_printers,
    701                 deferred_pprinters=self.deferred_printers)
--> 702             printer.pretty(obj)
    703             printer.flush()
    704             return stream.getvalue()

~\Anaconda3\envs\fastaienv\lib\site-packages\IPython\lib\pretty.py in pretty(self, obj)
    400                         if cls is not object \
    401                                 and callable(cls.__dict__.get('__repr__')):
--> 402                             return _repr_pprint(obj, self, cycle)
    403 
    404             return _default_pprint(obj, self, cycle)

~\Anaconda3\envs\fastaienv\lib\site-packages\IPython\lib\pretty.py in _repr_pprint(obj, p, cycle)
    695     """A pprint that just redirects to the normal repr function."""
    696     # Find newlines and replace them with p.break_()
--> 697     output = repr(obj)
    698     for idx,output_line in enumerate(output.splitlines()):
    699         if idx:

~\Anaconda3\envs\fastaienv\lib\site-packages\fastai\basic_data.py in __repr__(self)
    101 
    102     def __repr__(self)->str:
--> 103         return f'{self.__class__.__name__};\n\nTrain: {self.train_ds};\n\nValid: {self.valid_ds};\n\nTest: {self.test_ds}'
    104 
    105     @staticmethod

~\Anaconda3\envs\fastaienv\lib\site-packages\fastai\data_block.py in __repr__(self)
    611 
    612     def __repr__(self)->str:
--> 613         items = [self[i] for i in range(min(5,len(self.items)))]
    614         res = f'{self.__class__.__name__} ({len(self.items)} items)\n'
    615         res += f'x: {self.x.__class__.__name__}\n{show_some([i[0] for i in items])}\n'

~\Anaconda3\envs\fastaienv\lib\site-packages\fastai\data_block.py in <listcomp>(.0)
    611 
    612     def __repr__(self)->str:
--> 613         items = [self[i] for i in range(min(5,len(self.items)))]
    614         res = f'{self.__class__.__name__} ({len(self.items)} items)\n'
    615         res += f'x: {self.x.__class__.__name__}\n{show_some([i[0] for i in items])}\n'

~\Anaconda3\envs\fastaienv\lib\site-packages\fastai\data_block.py in __getitem__(self, idxs)
    649             else:                 x,y = self.item   ,0
    650             if self.tfms or self.tfmargs:
--> 651                 x = x.apply_tfms(self.tfms, **self.tfmargs)
    652             if hasattr(self, 'tfms_y') and self.tfm_y and self.item is None:
    653                 y = y.apply_tfms(self.tfms_y, **{**self.tfmargs_y, 'do_resolve':False})

~\Anaconda3\envs\fastaienv\lib\site-packages\fastai\vision\image.py in apply_tfms(self, tfms, do_resolve, xtra, size, resize_method, mult, padding_mode, mode, remove_out)
    120             elif tfm in size_tfms:
    121                 if resize_method in (ResizeMethod.CROP,ResizeMethod.PAD):
--> 122                     x = tfm(x, size=_get_crop_target(size,mult=mult), padding_mode=padding_mode)
    123             else: x = tfm(x)
    124         return x.refresh()

~\Anaconda3\envs\fastaienv\lib\site-packages\fastai\vision\image.py in __call__(self, x, *args, **kwargs)
    516     def __call__(self, x:Image, *args, **kwargs)->Image:
    517         "Randomly execute our tfm on `x`."
--> 518         return self.tfm(x, *args, **{**self.resolved, **kwargs}) if self.do_run else x
    519 
    520 def _resolve_tfms(tfms:TfmList):

~\Anaconda3\envs\fastaienv\lib\site-packages\fastai\vision\image.py in __call__(self, p, is_random, use_on_y, *args, **kwargs)
    462     def __call__(self, *args:Any, p:float=1., is_random:bool=True, use_on_y:bool=True, **kwargs:Any)->Image:
    463         "Calc now if `args` passed; else create a transform called prob `p` if `random`."
--> 464         if args: return self.calc(*args, **kwargs)
    465         else: return RandTransform(self, kwargs=kwargs, is_random=is_random, use_on_y=use_on_y, p=p)
    466 

~\Anaconda3\envs\fastaienv\lib\site-packages\fastai\vision\image.py in calc(self, x, *args, **kwargs)
    467     def calc(self, x:Image, *args:Any, **kwargs:Any)->Image:
    468         "Apply to image `x`, wrapping it if necessary."
--> 469         if self._wrap: return getattr(x, self._wrap)(self.func, *args, **kwargs)
    470         else:          return self.func(x, *args, **kwargs)
    471 

~\Anaconda3\envs\fastaienv\lib\site-packages\fastai\vision\image.py in pixel(self, func, *args, **kwargs)
    170     def pixel(self, func:PixelFunc, *args, **kwargs)->'Image':
    171         "Equivalent to `image.px = func(image.px)`."
--> 172         self.px = func(self.px, *args, **kwargs)
    173         return self
    174 

~\Anaconda3\envs\fastaienv\lib\site-packages\fastai\vision\image.py in px(self)
    143     def px(self)->TensorImage:
    144         "Get the tensor pixel buffer."
--> 145         self.refresh()
    146         return self._px
    147     @px.setter

~\Anaconda3\envs\fastaienv\lib\site-packages\fastai\vision\image.py in refresh(self)
    130             self._logit_px = None
    131         if self._affine_mat is not None or self._flow is not None:
--> 132             self._px = _grid_sample(self._px, self.flow, **self.sample_kwargs)
    133             self.sample_kwargs = {}
    134             self._flow = None

~\Anaconda3\envs\fastaienv\lib\site-packages\fastai\vision\image.py in _grid_sample(x, coords, mode, padding_mode, remove_out)
    532         d = min(x.shape[1]/coords.shape[1], x.shape[2]/coords.shape[2])/2
    533         # If we're resizing up by >200%, and we're zooming less than that, interpolate first
--> 534         if d>1 and d>z: x = F.interpolate(x[None], scale_factor=1/d, mode='area')[0]
    535     return F.grid_sample(x[None], coords, mode=mode, padding_mode=padding_mode)[0]
    536 

~\Anaconda3\envs\fastaienv\lib\site-packages\torch\nn\functional.py in interpolate(input, size, scale_factor, mode, align_corners)
   2549         return adaptive_avg_pool1d(input, _output_size(1))
   2550     elif input.dim() == 4 and mode == 'area':
-> 2551         return adaptive_avg_pool2d(input, _output_size(2))
   2552     elif input.dim() == 5 and mode == 'area':
   2553         return adaptive_avg_pool3d(input, _output_size(3))

~\Anaconda3\envs\fastaienv\lib\site-packages\torch\nn\functional.py in adaptive_avg_pool2d(input, output_size)
    787     """
    788     _output_size = _list_with_default(output_size, input.size())
--> 789     return torch._C._nn.adaptive_avg_pool2d(input, _output_size)
    790 
    791 

RuntimeError: "adaptive_avg_pool2d_cpu" not implemented for 'Byte'

I am not sure why the error propagates to all data, but can you try with:

image2 = PIL.Image.open(directory+image_name).convert('RGB')
t = pil2tensor(image2, dtype=np.float32)
t.div_(255)
im = Image(t)
imb, _ = data.one_item(im, detach=False, denorm=False); imb

That’s how fastai opens an image by default.

1 Like

Makes no sense, right? I’d like to know why it happened

Nice! It works. Thanks!

Where did you find it in fastai?

I still don’t know why it happened, but for the way fastai opens images, they way it works is:

  • It calls ImageList.get, which calls ImageList.open (you can find it in fastai.vision.data)
  • It calls open_image, which is placed in fastai.vision.image. The code is:
def open_image(fn:PathOrStr, div:bool=True, convert_mode:str='RGB', cls:type=Image,
        after_open:Callable=None)->Image:
    "Return `Image` object created from image in file `fn`."
    with warnings.catch_warnings():
        warnings.simplefilter("ignore", UserWarning) # EXIF warning from TiffPlugin
        x = PIL.Image.open(fn).convert(convert_mode)
    if after_open: x = after_open(x)
    x = pil2tensor(x,np.float32)
    if div: x.div_(255)
    return cls(x)
3 Likes