Exercício 4 - CNN

Neste exercício, você vai trabalhar com o banco de dados Fashion MNIST e implementar um classificador multiclasse usando uma CNN. Esse dataset contem 70000 imagens 28x28 de peças de vestuário distribuídas em 10 classes, divididas em um conjunto de treinamento com 60000 imagens e um de teste com 10000.

O banco de dados Fashion MNIST tem as mesmas características do banco de dados MNIST (imagens 28x28 e 10 classes), sendo possível substituí-lo diretamente. A sugestão é que seja usado o exemplo da CNN com PyTorch, substituindo a parte de carregamento de dados do MNIST, para o Fashion MNIST, como no exemplo:

import matplotlib.pyplot as plt
import torch

from torchvision import datasets, transforms

Nb = 64

dir_data = "~/temp"

train_loader = torch.utils.data.DataLoader(
    datasets.FashionMNIST(
        dir_data,
        train=True,
        download=True,
        transform=transforms.Compose(            
            [transforms.ToTensor()]
        ),
    ),
    batch_size=Nb,
    shuffle=True,
)

plt.figure(figsize=(16, 6))
for i in range(10):
    plt.subplot(2, 5, i + 1)
    image, _ = train_loader.dataset.__getitem__(i)
    plt.imshow(image.squeeze().numpy())
    plt.axis('off');

Você deve implementar uma rede CNN, com a etapa de treinamento e teste, de forma que o resultado de acurácia da classificação seja superior à 90% considerando os dados de teste. Para tanto, faça simulações alterando a arquitetura da rede ou ajustando os hiperparâmetros, até conseguir o desempenho desejado.

Ao final do exercício, você deverá apresentar:

  1. Os códigos utilizados para treinar o modelo e avaliá-lo com os conjuntos de teste;

  2. O valor obtido para a acurácia considerando os dados de teste.

A sugestão é que o relatório seja elaborado utilizando um Jupyter Notebook e a linguagem Python, já que essas são as ferramentas que estamos utilizando neste bloco do curso. No entanto, isso não é obrigatório e você pode usar outra linguagem de programação, caso queira.

Instruções para entrega

  • O exercício pode ser feito em dupla ou individualmente;

  • A entrega deve incluir:

    • Um vídeo de no máximo 40s, mostrando a resolução do exercício;
    • Os códigos-fontes dos programas, preferencialmente organizados em um Jupyter Notebook, descrevendo o experimento e mostrando como foram obtidos os resultados solicitados.
  • A correção será feita baseada no vídeo. Quando o professor/pesquisador ficar com alguma dúvida, serão consultados os códigos-fonte;

  • Sobre o vídeo:

    • Deve incluir áudio descrevendo o experimento;
    • Gravem a tela do computador usando celular ou usando algum programa de captura de tela (por exemplo Zoom, Google Meet, ou OBS Studio);
    • No início, deve aparecer o rosto e algum documento do aluno que gravou o vídeo (como a carteira USP, RG, CNH, etc);
    • No caso de entrega em dupla, não é necessário que os dois componentes apareçam no vídeo. No entanto, alternem o apresentador ao longo das entregas dos exercícios e não esqueçam de incluir os dois nomes no início do vídeo.
    • Procurem convencer o espectador do vídeo, que vai corrigir o exercício que fizeram os exercícios computacionais solicitados e que eles estão funcionando corretamente. Tentem fazer um bom aproveitamento do tempo para apresentar os resultados solicitados, respeitando o limite de 40s e não acelerem a velocidade do vídeo;
  • Sobre os códigos-fonte:

    • Incluir o nome do(s) aluno(s) no início do programa;
  • Sobre o envio no Moodle:

    • Apenas um aluno de cada dupla deve enviar o vídeo no Moodle;
    • Podem ser enviados o arquivo de vídeo (.mkv, .mp4, .avi, etc.) ou um link para o vídeo (Youtube, Google Drive, etc);
      • No segundo caso, certifiquem-se que todos os professores/pesquisadores (magno.silva@usp.br, hae.kim@usp.br, renatocan@lps.usp.br, wesleybeccaro@usp.br) tenham acesso ao seu vídeo.
    • Não se esqueçam de escrever o nome dos componentes da dupla (ou do único aluno, escrevendo: “exercício feito individualmente”) em três lugares diferentes: no campo “comentários sobre o envio” no Moodle, no início do vídeo e no início dos códigos-fonte.