!wget https://s3.amazonaws.com/fast-ai-imageclas/imagenette-160.tgz
!tar -xvzf imagenette-160.tgz
## PROJET:
#Vous allez classifier un jeu de données d'images. Il contient environ 12.800 images pour 10 classes:
#tench, English springer, cassette player, chain saw, church, French horn, garbage truck, gas pump, golf ball, parachute
#Les images sont de taille 160 px et sont déjà splitées en train et val
#Vous allez utiliser google colab (https://colab.research.google.com), créer une notebook sur python 3, ensuite aller dans onglet runtime > change runtime type et mettre GPU en hardware accelerator. Vous pouvez désormais utiliser un GPU.
#Pour coder le CNN, vous allez utiliser la libraire pytorch. Elle est déjà installée sur l'instance colab. Vous devez absolument travailler avec la doc en parallèle. Essayez de poser un minimum de question et faites vous guider par les ressources que vous trouverez dans la doc ou forums
## INSTRUCTIONS:
#Utiliser les datasets et dataloader pour utiliser les données (ici, on utilise ImageFolder)
#Utiliser la fonction transform pour pour resize les images 64,64
#On envoit les données par paquet dans le réseau (batch_size), a vous de trouver le bon nombre a donner en argument a votre dataloader
#Utiliser le GPU : appeler cuda() sur votre modèle (qui implémente torch.nn.module) et sur les données qui entrent dans votre réseau
#Bonne pratique pour les CNN : faire une succession de convolution (nn.conv2d), d'activation relu (F.relu), puis de pooling (nn.MaxPool2d)
#Attention, les features maps du CNN sont en 3D, il faut repasser a 1D à un moment pour la classif , utiliser torch.view (ex : batch_size,3x3x64 => bathc_size,576 puis bs,576 -> bs,10)
#La sortie doit etre de taille 10, il y a 10 classes
#Utiliser la loss adaptée pour classif
#Utiliser la descente de gradient stochastique pour optimiser le reseau (optim.SGD)
#Avant d'envoyer un paquet dans le réseau, utiliser optimize.zero_grad. Après passage du batch, utiliser optim.step()
#A vous de trouver le meilleur learning rate
#Apres chaque epoch, faire une evaluation
#Prediction : prendre à la sortie la classe qui a la meilleure confiance (torch.max) et comparer avec le label ground-truth. Pour cela, il faut itérer sur le dataloader de val.
#Restrictions :
# 1)
#Avoir moins de 500.000 parametres
# print("Nombre total de params",sum(p.numel() for p in model.parameters())) ou la variable model est votre modèle.
# 2)
#Avoir moins de 250 secondes d'execution :
# import time
# start = time.time()
# A la fin : print("Temps d'execution : ", time.time()-start, 'secondes.')
#Notation : 1/1 si réseau finit ses 10 epochs en moins de 250 secondes avec une epoch avec précision > 55 %
# 1 point bonus si vous battez ma solution en paramètres + temps (145 secondes) ET en précision (65%)
#Ma solution :