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
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:
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.
Following up my own post, rather than revert to 2.7.10, zerosingularity found a better solution…
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.
(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.
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
The predict function throws an erroris_cat,_,probs = learn.predict(img)
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.
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
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.
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__