Reconhecimento de números (MNIST) utilizando fastai
Tutorial utilizar o fastai para classificação do MNIST.
Esse tutorial tem como objetivo utilizar o framework de machine learning fastai
, para realizar um dos desafios mais tradicionais de classificação de imagens. Este é um dos desafios iniciais para os apredizes de redes neurais artificiais no que tange processamento de imagens, a base de dados utilizada para projeto pode ser encontradas em dois links diferentes:
- Kaggle: https://www.kaggle.com/c/digit-recognizer/data;
- The MNIST database: http://yann.lecun.com/exdb/mnist/.
from fastai.vision.all import *
import numpy as np
import pandas as pd
Durante esse projeto estara sendo utilizado a versão 2.0.8 do fastai.
fastai.__version__
Um ponto inicial para o projeto é a definicação de um objeto que contenha o caminho diretório das imagens, para isso será utilizada o método Path
do fastai. Esse método não retornará somente uma string
contendo o diretório, mas sim uma classe da biblioteca padrão do Python 3, o que torna mais fácil o acesso aos arquivos e diretórios.
path = Path(r"/content/images")
Para carregar as imagens para o treinamento do modelo precisamos uma função a qual determina o tipo da base de dados e como ela está estruturada. Para isso, utiliza-se a função ImageDataLoaders
.
dls = ImageDataLoaders.from_folder(path, train = 'train', valid = 'valid', shuffle_train = True, bs=16)
Para definição da rede neural convolucional (Convolutional Neural Network) é utilizada a função cnn_learner
.
Os argumentos que serão passados para esta será:
dls
dataloader definido anteriormente;resnet34
- arquitetura da rede neural, que neste caso está pretreinada amplamente utilizada para esse fim. Para saber mais sobre a resnet34: https://www.kaggle.com/pytorch/resnet34;error_rate
- metrica utilizada para avaliação do modelo.
Afim de agilizar o treinamento do modelo, será utilizado o método to_fp16
(half-precision floating point) que utilizada números menos precisos, onde é possível.
Após isso pode-se realizar o treinamento da rede neural, para isso está sendo utilizada o método fine_tune
. Como estamos utilizando uma rede neural pre-treinada, iremos realizar 4 iterações randomicamente utilizando os parâmetros pre-treinados e depois "descongela" todos as camadas treina o modelo alterando todos os pesos.
from fastai.callback.fp16 import *
learn = cnn_learner(dls, resnet34, metrics=error_rate).to_fp16()
learn.fine_tune(12, freeze_epochs=4)
Como pode-se observar no gráfico abaixo, o erro apresentado durante o trainamento decresceu até a marca de 5.27e-4
utilizando na base de dados de treinamento, o que para parece muito bom.
learn.recorder.plot_loss()
Para salvar o modelo pode-se utilizar o método export()
, o qual irá salvar no diretório padrão o arquivo export.pkl
. Para carregar o modelo basta utilizar a função load_learn()
.
learn.export()
Para se realizar as predições, será utilizada o método predict()
e o argumento é o arquivo de imagem em .jpg
.
#hide_output
pred = []
for i in range(len(test_images)):
image_path = "/content/images/test/" + str(i) + ".jpg"
pred.append(int(learn.predict(image_path)[0]))
Para salvar o arquivo em um formato .csv
foi criado um dataframe do pacote pandas
e feita as devidas transformações para ser enviado para o Kaggle.
prediction = {'ImageId': list(range(1,28001)),
'Label': pred}
df = pd.DataFrame(prediction)
df.to_csv('predicitons.csv', index = False)
Este modelo acertou 99,421% das 28000 imagens de teste.