项目作者: ceciliacsilva

项目描述 :
Mnist solved in Lush-gblearn.
高级语言: Racket
项目地址: git://github.com/ceciliacsilva/lushMnist.git
创建时间: 2016-06-12T13:43:37Z
项目社区:https://github.com/ceciliacsilva/lushMnist

开源协议:

下载


Mnist - Lush

Esse projeto é o trabalho da disciplina de Inteligência Artificial (IA), o objetivo é classificar dígitos manuscritos [0-9]. Mnist é um conjunto de imagens manuscritas e seus respectivos labels. Os conjuntos de treinamento e testes, devem ser baixados no site “THE MNIST DATABASE of handwritten digits”, http://yann.lecun.com/exdb/mnist/. Faça o download dos 4 arquivos, os dois primeiros serão usados para treinar a rede e os dois últimos para testar. Siga as instruções do site para descompactá-los.

Todas as entradas serão imagens 28x28 pixels.

Requisitos

  • [1] Lush, disponível em: http://lush.sourceforge.net/. Lush is an object-oriented programming language designed for researchers, experimenters, and engineers interested in large-scale numerical and graphic applications.

  • [2] Racket Language, disponível em: http://racket-lang.org/. Racket is a full-spectrum programming language. It goes beyond Lisp and Scheme with dialects that support objects, types, laziness, and more.

Transformação de imagens

Programa em Racket Language. Programa auxiliar para transformar uma imagem .png de um único canal, em um padrão que será quebrado no programa principal. Alterar os diretórios base, as variáveis png-path e mnist-path no programa transformaImagens.rkt.

  1. $ racket
  2. Welcome to Racket v6.2.1.
  3. > (load "transformaImagens.rkt")
  4. > (enter! "transformaImagens.rkt")

Crie uma imagem .png, por exemplo, no GIMP (GNU Image Manipulation Program), desenhando um número de 0 a 9. Nomeie o arquivo com “.png”. Lembrando sempre que esse arquivo deve ter 28x28 pixels. Considere o arquivo 0.png, disponível na pasta imagens.

  1. > ;(png->mnist "<digito>.png" "<extenção-mnist>")
  2. > (png->mnist "0.png" "ccs")

O arquivo “0.ccs” foi criado na mnist, ele tem um padrão proprio para ser quebrado no programa principal.

Eblearn

Não usaremos diretamente. Instalando eblearn usando os fontes.

  1. $ svn checkout https://svn.code.sf.net/p/eblearn/code/trunk eblearn-code
  2. $ cd eblearn-code/tools
  3. $ make

Copie os arquivos baixado no site do Yann LeCun para o diretório demos/mnist. Extraia os arquivos. Testando os dados de treinamento. Confira se os ‘paths’ no arquivo mnist.conf estão corretos, no meu caso:

  1. ebl = ${HOME}/machineLearning/eblearn-code # eblearnroot
  2. root = ${ebl}/demos/mnist # mnist data root

Comandos:

  1. $ cd ../demos/mnist
  2. $ ../../bin/train mnist.conf

Programa principal

Programa em Lush. Implementação da rede neural, ou melhor ‘Convolutional Neural Networks’ (ConvNets), rede adaptada para processar imagens, usa o método Backpropagation (http://www.icmc.usp.br/~andre/research/neural/MLP.htm), para realizar o treinamento supervisionado, com “gradient-based training”. O software usa a biblioteca “gblearn”, disponível por padrão nas atuais versões do Lush.

Executar ‘../../bin/train mnist.conf’ em mnist-path. -> eblearn-code/demos/mnist/

Alterar os caminhos, mnist-path e arq-path, arquivo “mnistCecilia.lsh”.

Treinando a rede com 60000.

  1. ? (load "mnistCecilia.lsh")
  2. ? ;(defvar <nome-rede> (mnist-main <qtdd-imagens-treinar>))
  3. ? (defvar rede (mnist-main 60000))
  4. Rede treinada com 60000 imagens.
  5. = rede
  6. realtime = = 1097.647s aproximadamente 19 min

Testando a rede treinada. Foram implementados 3 tipos de testes.

  • Porcentagem de acertos

Dada uma quantidade de imagens de entrada, em quantas a rede acertou o digito desenhado.

  1. ? ;(<nome-rede> <qtdd-imagens-teste>)
  2. ? (rede 100)
  3. Testando a rede para 100 imagens.
  4. [60000] size=100 energy=0.0514 correct=100.00% errors=0.00% rejects=0.00%
  5. = ()
  6. ? (rede 1000)
  7. Testando a rede para 1000 imagens.
  8. [60000] size=1000 energy=0.0784 correct=99.00% errors=1.00% rejects=0.00%
  9. = ()
  • Imagem do banco de teste

Verificar a resposta da rede para uma imagem específica no banco de teste.

  1. ? ;(<nome-rede> <qtdd-imagens-teste> <imagem-desejada>)
  2. ? (rede 100 23)
  3. Testando o elemento 23 do arquivo t10k-images.
  4. "Imagem:"
  5. <visualização do número>
  6. Esperado = 5 | Obtido = 5
  7. = ()
  • Imagem criada localmente

Testar uma imagem criada localmente, traduzida usando o programa “transformaImagem.rkt”.

  1. ? ;(<nome-rede> <qtdd-imagens-teste> <digito>.<extensão>)
  2. ? (rede 100 "0.ccs")
  3. (("7.ccs" 19) ("9.vlq" 18) ("5.ccs" 17) ("0.vlq" 16) ("6.vlq" 15) ("3.vlq" 14) ("8.ccs" 13) ("5.vlq" 12) ("9.ccs" 11) ("3.ccs" 10) ("1.vlq" 9) ("7.vlq" 8) ("2.ccs" 7) ("6.ccs" 6) ("0.ccs" 5) ("8.vlq" 4) ("4.vlq" 3) ("4.ccs" 2) ("1.ccs" 1))
  4. Testando o elemento 0.ccs do arquivo t10k-images.
  5. "Imagem:"
  6. <visualização número>
  7. Esperado = 0 | Obtido = 0
  8. = ()