Lesson 1 official topic

This seems to have to do with the newest version of fastai, see here Beginner: Basics of fastai, PyTorch, numpy, etc ✅ - #50 by zerotosingularity as well as some messages directly above yours in this thread

2 Likes

Thanks to @lucasvw for sharing where!

Thanks!

You must have missed the immediately preceeding post in your research…

btw, could you please edit your post so that its length doesn’t clutter the page in perpetuity.

Hello, my first day of looking at the fastai course and forums (also in bed with COVID). Stuck at the first exercise of Lesson 1, go figure…

Wondering if anyone can help please?

When I run this line:

is_cat,_,probs = learn.predict(img)

I get an error:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/tmp/ipykernel_23/1585674285.py in <module>
      1 uploader = SimpleNamespace(data = ['/kaggle/input/images/IMG_6049.jpg'])
      2 img = PILImage.create(uploader.data[0])
----> 3 is_cat = learn.predict(img)
      4 # print(f"Is this a cat?: {is_cat}.")
      5 # print(f"Probability it's a cat: {probs[1].item():.6f}")

Copied straight from the book, so not sure what’s wrong here??
Thanks!

hey @gizzard I believe the issue is coming from line 2 due to PILImage not having a read attribute, after searching the forums for a bit, I wasn’t able to conclude on how to get the read attribute imported.

My workaround was to include the file path directly like so:
image

I’ll get back to you if I can get the read attribute to work

edit:
After searching the forum some more I found that the newest fastAI version doesn’t support PIL image being passed into the learn.predict() method anymore.

3 Likes

Following up my own post, rather than revert to 2.7.10, zerosingularity found a better solution…

3 Likes

@montanoj14 and @bencoman thanks very much for your assistance, much appreciated. All working now!

I thank you all for the assistance, as I was in need of this same bit of help.

Should I/we seek to alert JHoward (or some Fast AI person/entity) to this difficulty? It’s very early in the course, and it seems this could easily “derail” many people just getting their start.

I look forward to any replies.

Again, I thank you.

1 Like

(above - referencing the recent discussion by montanoj14, bencoman, and gizzard)

@SRS-One the bug is noted on the fastai github.

P.S. You can edit your post afterwards. By clicking the pencil button

“You must have missed the immediately preceding post in your research…”. - no shit.

I deleted my question so it does not clutter the forum in perpetuity.

1 Like

I thank you.

Is there a step by step procedure to install RISE on the Kaggle notebook? I have not been able to get the command palette button or the cell toolbar. I used:
pip install RISE as explained in RISE — RISE 5.7.1

Hi, I really hope this is the right place to ask my question.

I’m getting an error when I run the first example of the fastbook (the one that trains a model, shows an upload button, then determines whether my image is of a cat vs a dog)

  • I was able to successfully train the model
  • I was able to successfully load my image (tested that the problem was not with the upload button by showing a small thumbnail of the image I uploaded via to_thumb())
  • everytime a run
     is_cat,_,probs = learn.predict(img)
    
    The predict function throws an error :frowning:

The error starts with learn.predict and ends with:

File ~/jupyter/lib/python3.10/site-packages/PIL/Image.py:529, in Image.__getattr__(self, name)
    527     deprecate("Image categories", 10, "is_animated", plural=True)
    528     return self._category
--> 529 raise AttributeError(name)

AttributeError: read

I can post the full backtrace but it’s quite long. Any help would realy be appreciated.

Note: I’m running jupyter on my linux laptop inside a venv. Python version is 3.10.6.

Hi, I’m new to the course, and I’m trying just to train the cats&dogs model, using Google Colab it takes years (more than 1 hour and still running) to run the “fine_tune” function.

I’m also trying it on Kaggle, it looks a bit faster, but still is taking lot of time. Is this normal?

Hi,

I don’t think that is normal. It looks like you are not using GPU.
On Google Colab, you can click on Runtime tab on the top left corner and click change runtime type. If it’s CPU, you should change it to a GPU.
On Kaggle, you can take the similar approach.

1 Like

Ok! thank you for the tip, I thought the GPU choice in Kaggle was a payment option or something like that. I see they’re limited to an amount of hours per week, which, of course, is enough for a student like me.

It took only 2 minutes now to train the cats & dogs model. What a difference :smiley:

Since it took me so long without the GPU, I setup a conda environment locally and it took 7 minutes in my non-Nvidia GPU desktop, that anyway, was much better than the 1h in Google Colab & Kaggle without GPU. But having the GPU option in Kaggle, I’ll do the things there.

3 Likes

Hello! I am new and am excited to check out this course. I noticed there’s an issue with the very first Kaggle demonstration notebook (Is it a bird?).

If this should be posted elsewhere, please let me know – but PLEASE do not be mean like many on StackOverflow. I attempted to solve the error with GPT-4 as well, and it was having a tough time.

Without making any modifications, and just running the code as is, the last cell output produces an error. I find this unfortunate and it does not aid in my learning. All cells in the notebook were ran sequentially.

I have attempted to run the cells in both google colab and kaggle environments, and both produce the same error. I also could not similar questions posted.

Here’s the last cell ran:

is_bird,_,probs = learn.predict(PILImage.create('bird.jpg'))
print(f"This is a: {is_bird}.")
print(f"Probability it's a bird: {probs[0]:.4f}")

Error:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/tmp/ipykernel_17/1213330699.py in <module>
----> 1 is_bird,_,probs = learn.predict(PILImage.create('bird.jpg'))
      2 print(f"This is a: {is_bird}.")
      3 print(f"Probability it's a bird: {probs[0]:.4f}")

/opt/conda/lib/python3.7/site-packages/fastai/learner.py in predict(self, item, rm_type_tfms, with_input)
    319     def predict(self, item, rm_type_tfms=None, with_input=False):
    320         dl = self.dls.test_dl([item], rm_type_tfms=rm_type_tfms, num_workers=0)
--> 321         inp,preds,_,dec_preds = self.get_preds(dl=dl, with_input=True, with_decoded=True)
    322         i = getattr(self.dls, 'n_inp', -1)
    323         inp = (inp,) if i==1 else tuplify(inp)

/opt/conda/lib/python3.7/site-packages/fastai/learner.py in get_preds(self, ds_idx, dl, with_input, with_decoded, with_loss, act, inner, reorder, cbs, **kwargs)
    306         if with_loss: ctx_mgrs.append(self.loss_not_reduced())
    307         with ContextManagers(ctx_mgrs):
--> 308             self._do_epoch_validate(dl=dl)
    309             if act is None: act = getcallable(self.loss_func, 'activation')
    310             res = cb.all_tensors()

/opt/conda/lib/python3.7/site-packages/fastai/learner.py in _do_epoch_validate(self, ds_idx, dl)
    242         if dl is None: dl = self.dls[ds_idx]
    243         self.dl = dl
--> 244         with torch.no_grad(): self._with_events(self.all_batches, 'validate', CancelValidException)
    245 
    246     def _do_epoch(self):

/opt/conda/lib/python3.7/site-packages/fastai/learner.py in _with_events(self, f, event_type, ex, final)
    197 
    198     def _with_events(self, f, event_type, ex, final=noop):
--> 199         try: self(f'before_{event_type}');  f()
    200         except ex: self(f'after_cancel_{event_type}')
    201         self(f'after_{event_type}');  final()

/opt/conda/lib/python3.7/site-packages/fastai/learner.py in all_batches(self)
    203     def all_batches(self):
    204         self.n_iter = len(self.dl)
--> 205         for o in enumerate(self.dl): self.one_batch(*o)
    206 
    207     def _backward(self): self.loss_grad.backward()

/opt/conda/lib/python3.7/site-packages/fastai/data/load.py in __iter__(self)
    125         self.before_iter()
    126         self.__idxs=self.get_idxs() # called in context of main process (not workers/subprocesses)
--> 127         for b in _loaders[self.fake_l.num_workers==0](self.fake_l):
    128             # pin_memory causes tuples to be converted to lists, so convert them back to tuples
    129             if self.pin_memory and type(b) == list: b = tuple(b)

/opt/conda/lib/python3.7/site-packages/torch/utils/data/dataloader.py in __next__(self)
    519             if self._sampler_iter is None:
    520                 self._reset()
--> 521             data = self._next_data()
    522             self._num_yielded += 1
    523             if self._dataset_kind == _DatasetKind.Iterable and \

/opt/conda/lib/python3.7/site-packages/torch/utils/data/dataloader.py in _next_data(self)
    559     def _next_data(self):
    560         index = self._next_index()  # may raise StopIteration
--> 561         data = self._dataset_fetcher.fetch(index)  # may raise StopIteration
    562         if self._pin_memory:
    563             data = _utils.pin_memory.pin_memory(data)

/opt/conda/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py in fetch(self, possibly_batched_index)
     32                 raise StopIteration
     33         else:
---> 34             data = next(self.dataset_iter)
     35         return self.collate_fn(data)
     36 

/opt/conda/lib/python3.7/site-packages/fastai/data/load.py in create_batches(self, samps)
    136         if self.dataset is not None: self.it = iter(self.dataset)
    137         res = filter(lambda o:o is not None, map(self.do_item, samps))
--> 138         yield from map(self.do_batch, self.chunkify(res))
    139 
    140     def new(self, dataset=None, cls=None, **kwargs):

/opt/conda/lib/python3.7/site-packages/fastcore/basics.py in chunked(it, chunk_sz, drop_last, n_chunks)
    228     if not isinstance(it, Iterator): it = iter(it)
    229     while True:
--> 230         res = list(itertools.islice(it, chunk_sz))
    231         if res and (len(res)==chunk_sz or not drop_last): yield res
    232         if len(res)<chunk_sz: return

/opt/conda/lib/python3.7/site-packages/fastai/data/load.py in do_item(self, s)
    151     def prebatched(self): return self.bs is None
    152     def do_item(self, s):
--> 153         try: return self.after_item(self.create_item(s))
    154         except SkipItemException: return None
    155     def chunkify(self, b): return b if self.prebatched else chunked(b, self.bs, self.drop_last)

/opt/conda/lib/python3.7/site-packages/fastai/data/load.py in create_item(self, s)
    158     def retain(self, res, b):  return retain_types(res, b[0] if is_listy(b) else b)
    159     def create_item(self, s):
--> 160         if self.indexed: return self.dataset[s or 0]
    161         elif s is None:  return next(self.it)
    162         else: raise IndexError("Cannot index an iterable dataset numerically - must use `None`.")

/opt/conda/lib/python3.7/site-packages/fastai/data/core.py in __getitem__(self, it)
    456 
    457     def __getitem__(self, it):
--> 458         res = tuple([tl[it] for tl in self.tls])
    459         return res if is_indexer(it) else list(zip(*res))
    460 

/opt/conda/lib/python3.7/site-packages/fastai/data/core.py in <listcomp>(.0)
    456 
    457     def __getitem__(self, it):
--> 458         res = tuple([tl[it] for tl in self.tls])
    459         return res if is_indexer(it) else list(zip(*res))
    460 

/opt/conda/lib/python3.7/site-packages/fastai/data/core.py in __getitem__(self, idx)
    415         res = super().__getitem__(idx)
    416         if self._after_item is None: return res
--> 417         return self._after_item(res) if is_indexer(idx) else res.map(self._after_item)
    418 
    419 # %% ../../nbs/03_data.core.ipynb 53

/opt/conda/lib/python3.7/site-packages/fastai/data/core.py in _after_item(self, o)
    375             raise
    376     def subset(self, i): return self._new(self._get(self.splits[i]), split_idx=i)
--> 377     def _after_item(self, o): return self.tfms(o)
    378     def __repr__(self): return f"{self.__class__.__name__}: {self.items}\ntfms - {self.tfms.fs}"
    379     def __iter__(self): return (self[i] for i in range(len(self)))

/opt/conda/lib/python3.7/site-packages/fastcore/transform.py in __call__(self, o)
    206         self.fs = self.fs.sorted(key='order')
    207 
--> 208     def __call__(self, o): return compose_tfms(o, tfms=self.fs, split_idx=self.split_idx)
    209     def __repr__(self): return f"Pipeline: {' -> '.join([f.name for f in self.fs if f.name != 'noop'])}"
    210     def __getitem__(self,i): return self.fs[i]

/opt/conda/lib/python3.7/site-packages/fastcore/transform.py in compose_tfms(x, tfms, is_enc, reverse, **kwargs)
    156     for f in tfms:
    157         if not is_enc: f = f.decode
--> 158         x = f(x, **kwargs)
    159     return x
    160 

/opt/conda/lib/python3.7/site-packages/fastcore/transform.py in __call__(self, x, **kwargs)
     79     @property
     80     def name(self): return getattr(self, '_name', _get_name(self))
---> 81     def __call__(self, x, **kwargs): return self._call('encodes', x, **kwargs)
     82     def decode  (self, x, **kwargs): return self._call('decodes', x, **kwargs)
     83     def __repr__(self): return f'{self.name}:\nencodes: {self.encodes}decodes: {self.decodes}'

/opt/conda/lib/python3.7/site-packages/fastcore/transform.py in _call(self, fn, x, split_idx, **kwargs)
     89     def _call(self, fn, x, split_idx=None, **kwargs):
     90         if split_idx!=self.split_idx and self.split_idx is not None: return x
---> 91         return self._do_call(getattr(self, fn), x, **kwargs)
     92 
     93     def _do_call(self, f, x, **kwargs):

/opt/conda/lib/python3.7/site-packages/fastcore/transform.py in _do_call(self, f, x, **kwargs)
     95             if f is None: return x
     96             ret = f.returns(x) if hasattr(f,'returns') else None
---> 97             return retain_type(f(x, **kwargs), x, ret)
     98         res = tuple(self._do_call(f, x_, **kwargs) for x_ in x)
     99         return retain_type(res, x)

/opt/conda/lib/python3.7/site-packages/fastcore/dispatch.py in __call__(self, *args, **kwargs)
    118         elif self.inst is not None: f = MethodType(f, self.inst)
    119         elif self.owner is not None: f = MethodType(f, self.owner)
--> 120         return f(*args, **kwargs)
    121 
    122     def __get__(self, inst, owner):

/opt/conda/lib/python3.7/site-packages/fastai/vision/core.py in create(cls, fn, **kwargs)
    123         if isinstance(fn,bytes): fn = io.BytesIO(fn)
    124         if isinstance(fn,Image.Image) and not isinstance(fn,cls): return cls(fn)
--> 125         return cls(load_image(fn, **merge(cls._open_args, kwargs)))
    126 
    127     def show(self, ctx=None, **kwargs):

/opt/conda/lib/python3.7/site-packages/fastai/vision/core.py in load_image(fn, mode)
     96 def load_image(fn, mode=None):
     97     "Open and load a `PIL.Image` and convert to `mode`"
---> 98     im = Image.open(fn)
     99     im.load()
    100     im = im._new(im.im)

/opt/conda/lib/python3.7/site-packages/PIL/Image.py in open(fp, mode, formats)
   2919         exclusive_fp = True
   2920 
-> 2921     prefix = fp.read(16)
   2922 
   2923     preinit()

/opt/conda/lib/python3.7/site-packages/PIL/Image.py in __getattr__(self, name)
    539             )
    540             return self._category
--> 541         raise AttributeError(name)
    542 
    543     @property

AttributeError: read

Looks like this may work – but begs the question of why hasn’t anyone updated the default notebook? Perhaps because it’s a free offering and no one is financially dependent on ensuring this course stays a good product for years to come…

if iskaggle:
    !pip install -Uqq fastai==2.7.10 duckduckgo_search
import fastai
fastai.__version__