Ressources

Projet :

Vous devez créer un pipeline d'apprentissage automatique, basé sur les réseau de neurones, sur la tâche Visual Question Answering (VQA). Ceci comprend:*

  • Creation d'un modèle
  • Creation d'un dataloader
  • Entraînement selon les splits
  • Test sur le split de test
  • Ecriture d'un rapport Scientifique

Creation d'un modèle

Les images sont de tailles 124x124. Les modèles classiques proposés par pytorch prennent en entrée des images de taille 224x224.
Nous voulons un modèle qui prennent en entrée les images de tailles 112x112.

Ce modèle encode l'image avec un CNN, et intègre la question dans le pipeline.

Creation d'un dataloader

  • sentence embedding (lente forward pass, il est judicieux de calculer cette représentation que une fois sachant que le modèle est pré-entrainé (et fixé).
  • il faut passer d'image 124x124 en 112x112, ceci permet de faire de la data-augmentation (randomresizecrop, randomflip, ...)
  • Le data loader retourne, au moins, la question, l'image et le label

Entraînement selon les splits

Il faut créer une procédure d'entrainement et selectionner votre meilleur modèle. Vous aurez surement besoin des methodes torch.save et torch.load pour gérer la sauvegarde de vos modèles.

Pour plus de facilités, vous pouvez directement connecter votre google drive a votre colab. https://colab.research.google.com/notebooks/io.ipynb

Il y a plein de manières d'améliorer votre entrainement, voici quelques pistes :

  • crop dataloader (image augmentation)
  • dropout
  • Model ensembling
  • Lr scheduler
  • Early stop

Pas permis:

  • Scale l'image en 224x224 et utiliser un réseau préentrainé

Ne pas oublier

  • net.train(), net.eval() ne calcule pas les gradients et le dropout

PS: Utiliser adam optimizer comme pour la scéance CNN.

Test sur le split de test: Pour la compétition, il faut reporter la réponse choisie par le modèle (argmax) (cf sample_submission.csv).
Pour le rapport, il faut reporter l'accuracy top-1 (donnée par le argmax, i.e. cette réponse est elle la bonne réponse) et l'accuracy top-5 (la bonne réponse se trouve-elle dans les 5 plus grandes confiances données par votre modèle? )

Ecriture d'un rapport Scientifique

Au minimum, expliquer les points ci-dessus.

Cela peut comprendre:

  • Explorez le jeu de données, donnez des exemples pour quelques classes, la distribution des labels (sous forme de graph ?)
  • Quand vous prenez une decision (par exemple, data augementation), montrez visuellement l'effet de cette décision
  • Expliquez votre réseau, que sont des convolution et du pooling, mettez des figures, expliquez votre stratégie pour définir la taille des filtres, etc..
  • Montrez l'évolution de vos résultats par epoch (sous forme de graph ?), plottez l'accuracy, et la loss. Quelle stratégie d'apprentissage utilisez vous (lr scheduler, early stop, ...)
  • Si vous utilisez du dropout, model ensembling, autre technique : explication et effet de cette technique, ...
  • PS: on a surement pas le temps de tout faire ! Concentrez vous sur certains points, et montrez leur impact (qu'il soit négatif ou positif, c'est ca la science...)
In [ ]:
!file=1pfd5-i_F20zViKIYwbQ8jL1p78s_E6uX && wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id='${file} -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id="${file} -O images.zip && rm -rf /tmp/cookies.txt \
&& unzip -qq images.zip && \
git clone https://github.com/jbdel/miniVQA
In [2]:
!ls && ls -d miniVQA/*
image124  images.zip  miniVQA  sample_data
miniVQA/answer_list.txt      miniVQA/sample_submission.csv  miniVQA/val.csv
miniVQA/image_question.json  miniVQA/test.csv
miniVQA/README.md	     miniVQA/train.csv

Overview dataset

In [3]:
!wc -l miniVQA/*.csv
  6288 miniVQA/sample_submission.csv
  6288 miniVQA/test.csv
 50300 miniVQA/train.csv
  6300 miniVQA/val.csv
 69176 total
In [12]:
import json
import random
import matplotlib.pyplot as plt
import cv2
from PIL import Image
image_question = json.load(open('miniVQA/image_question.json'))
plt.figure(figsize=([30, 20]))

for i in range(5):
  plt.subplot(1, 5, i+1)
  random_image = random.choice(list(image_question.keys()))
  _, random_question = random.choice(image_question[random_image])
  plt.imshow(Image.open('image124/'+random_image+'.jpg'))
  plt.xlabel('image_id: '+random_image)
  plt.title(random_question)

Sentence Embedding

In [ ]:
!pip install sentence_transformers
In [ ]:
from sentence_transformers import SentenceTransformer
import time

model = SentenceTransformer('distilbert-base-nli-mean-tokens').cuda() # ne pas toucher

sentences = 'This framework generates embeddings for each input sentence word hello ok'
time_start = time.time()
sentence_embeddings = model.encode(sentences)
print(time.time()-time_start)
print(sentence_embeddings.shape)
0.01096487045288086
(768,)
In [ ]:
(0.01*56000)/60
Out[ ]:
9.333333333333334