Share your work here ✅

To get started I’ve created a small dataset with indoor and outdoor images from a dutch real estate website. Only one wrongly image, top-left-corner (interp.plot_top_losses). Can’t wait to learn on what grounds the network makes it’s decisions.

Buiten = outside, binnen = inside

28 Likes

Cool stuff! Coincidentally I have started on the feature interpretation.

By applying PCA to the last layer before the predictions I get some really cool features, I interpreted the top two features as ‘naked/hairy’ and ‘dog/cat’. Now I can find the hairiest dogs, and the most naked cats:


I’ve shared my notebook here (only accessible by url).
Next I’ll train a linear classifier on these features to learn what features matter most for what breed.

Tips on how to improve the code are welcome by the way. Once I have a better grasp on the library I’ll rewrite this into a proper blog post :slight_smile:

67 Likes

Wow, great work! - Maybe you can explain your PCA setup in more detail?

1 Like

Talking about Quick Draw (or any other Kaggle competitions), it could be useful to check kernels:

Usually, you can find various scripts, notebooks, etc.

2 Likes

Great work! I love the results you found!

I think there are a few bits you can refactor, like:

  • fastai_v1 has a version of save features, and easier way to add hooks. Check out the hook_output, will give you the output of the layer you pass (you’ll just have to append them together). Once you’ve called the model on your input (see below), you’ll find the features in hook.stored.
  • You can just call Image.predict instead of copying the code of _predict. It will get the image through the model and call the hooks to give you the activations.
8 Likes

Nice! You can probably just use our existing callback for saving activations - or at least simplify your code using our HooksCallback:

http://docs.fast.ai/callbacks.hooks.html

Untested, but something like:

class StoreHook(HookCallback):
    def on_train_begin(self, **kwargs):
        super().on_train_begin(**kwargs)
        self.acts = []
    def hook(self, m, i, o): return o
    def on_batch_end(self, train, **kwargs): self.acts.append(self.hooks.stored)

You can pass a list of modules to the ctor to hook whatever layers you like.

18 Likes

Thanks for the input @jeremy @sgugger @MicPie.
Playing with the hooks now, will report back later :slight_smile:

With some image curation and resnet50 I’m close to 90% with my sports classifier. Mainly errors are boxing/wrestling - but I do see quite a few asymmetric errors - for example rugby gets recognized as soccer but rarely the other way around. Is this just my due to some very specific patterns defining rugby - and people running around a field is more probably something else? My favourite is the basketball classified as wrestling - a tricky one.


Edited - thanks @Taka - I hadn’t looked close enough! More image curation…

2 Likes

The one to the top right corner though :joy:

Edit : Sadly, the image has now been removed :wink:

1 Like

Removed the offensive image and re-ran my model - sorry @Taka and thanks for picking this up!

1 Like

Wow… didn’t know we can use PCA like this. Very cool way to classify data.

I created a model to classify a dataset of pasta images (± 3500 images of 5 types of pasta) that I downloaded from Google Images using the firefox extension someone else posted on here.

https://nbviewer.jupyter.org/gist/bvandepoel/1f1fe859cb02baf27ef7ba286e222780

It works pretty well, but struggles a bit with spaghetti vs linguine (which makes sense :smiley: ) Also, Resnet50 turns out quite a bit better than Resnet34 (13% vs 21% error).

4 Likes

THNX @radek, looking at your code I’ve figure out how to make TTA predictions with v1 :wink:

preds = learn.TTA(is_test=True)[0]

For an old kaggle competition:

Using almost everywhere only default values from lesson 1 i’ve got very good results on validation set (error_rate=0.030588):

Late submitting my predictions I’ve got a private score of 0.359 about 240/1440.

I’ll cleanup and share my nbk asap!

12 Likes

I thought of trying out something simple, to get used to the new fastai library. So, I built a model on the DHCD dataset (https://archive.ics.uci.edu/ml/datasets/Devanagari+Handwritten+Character+Dataset).

It’s a dataset similar to MNIST, but for Devanagari(देवनागरी) characters instead.

The dataset is not as well known and/or used, so was fun to try it out, and got pretty good results (error rate : 1.49% | accuracy : 98.51%) for less than an hour of tinkering.

Also, these top losses seem legit to me :joy:

30 Likes

Hi All,

I put together a medium blog post, It’s a Draft now, and haven’t publish it, I want to run it through all of you, to know your opinion, feedback, issues with article, issues with accuracy metrics, grammar, typo mistake, anything which comes to your mind.

I am planning to publish this by Saturday Eastern Time US. So any feedback till then is totally appreciated.

Huge Thanks to @jeremy for making this highly valuable education free for everyone, compare to many other institution, I attended in past for ML and DL.

3 Likes

Hi Community!

I’m seeing promising results on a 10 class audio classification task.

I am getting 76.3% accuracy with fastai and basically no effort, so that’s really cool! However, according to the publications listed on the dataset’s website, the top accuracy is 79%.

My goal is to surpass that by next weeks class, so I’m asking you guys for suggestions on what the most fruitful avenue might be:

  1. tune hyperparameters
  2. add audio specific data augmentation (obviously the common transformations don’t help with spectrograms)
  3. create better spectrograms which could be easier to classify

Here is my notebook.

thanks @jeremy for making this course so fun!

66 Likes

Hi all, really excited to see all the cool stuff people have been working on. Thanks again Jeremy, Rachel, and the rest of the community here - I’m looking forward to learning from all of you during this journey :slight_smile:

On the heels of week 1’s lesson, I decided to take a stab at my own image classification exploration between 4 different kinds of french fries (waffle, curly, shoestring, and tater tots). I wrote about it in a medium blog post (in addition to a little intro about my general excitement for fast.ai). Feel free to look through it if you’re interested!

Thanks :slight_smile:

5 Likes

Hey everyone, I wanted to see if cultural urban characteristics could be recognized by a resnet style architecture.

So I downloaded 4000 satellite images of the 1000 largest cities (using GMap’s static API), and labeled each with its country.

I was expecting it not to work that well, but got to 85% accuracy with resnet34 (over 110 classes !!!) - here are the worst offenders:

I’m not sure it’s not picking up some individual satellite characteristics rather than the urban specifics of each country but I’m curious to investigate this some more over the coming weeks.

Repo is here but the notebook is essentially a copy paste of the lesson’s code. Scraper is in there too (sorry it’s in Go but happy to share the binary)

57 Likes

This is a continuing project that I will be working on, but part one was just an analysis of an American Football college team taking the ball at the 25 yard line or trying to gain more yards. This is something that I wouldn’t have been able to accomplish without the help of fastai. Some of the future work I plan on doing with this data is more deep learning related where as this was more analytical. My next thing I want to do is build a model that predicts the outcome of a play so I think that will be more interesting from a technical perspective but this is my first blog post that I actually published (I’ve had some drafts, but nothing that felt polished enough to publish).

2 Likes

That’s an awesome idea for data collection. That could help get a good data sample together to train on before doing transfer learning onto your real images. I think that would be a useful tool. Maybe it could be a stand alone class though that is used to get a decent number of images and put them into a train/valid folder. You could maybe even have it display the image and let you y/n each image before it gets saved so you don’t get any false positives.

GetImagesFromGoogle(“puppies”, activeValidation=True) :slight_smile:

1 Like