Manual
do
Maker
.
com
O título é "Aprendendo Deep Learning com Keras" porque "eu" estou aprendendo. Mas detesto fazer anotações, afinal eu sempre perco em meio a tanta coisa no computador. Por isso, decidi fazer em formato de artigo para minhas próprias consultas até pegar o jeito. No final das contas, vai servir para outras pessoas que também querem iniciar-se em inteligência artificial.
Já escrevi alguma coisa com Keras, Caffe, TensorFlow e Theano. Se procurar aí na caixa de pesquisa, certamente vai encontrar. Bem, dessa vez estou tentando fazer uma coisa mais robusta. Vou citar detalhes importantes, dúvidas de iniciantes (como eu, que já usei profissionalmente IA e CV, mas não domino) e macetes, conforme eles surgirem.
Deep Learning é um subcampo do aprendizado de máquina. Pense em Machine Learning como uma macro. O assunto não é complexo apenas nos conceitos, mas desde a configuração de um ambiente até a codificação são igualmente dolorosos. Se você realmente quer aprender de verdade, vai ter que estudar como um Chinês.
Não sei ao certo até onde irei, mas por enquanto estou de boa vontade.
O deep learning utiliza um conjunto de algorítimos que imitam o comportamento do cérebro, usualmente chamado de ANN (Artificial Neural Network - ou Rede Neural Artificial).
Existem algumas bibliotecas para ajudar a compor a rede neural. Nesse artigo, estarei utilizando Keras com TensorFlow como backend. O Keras é uma API escrita em Python e suporta TensorFlow, CNTK ou Theano como backend. Eu desconheço o CNTK. Keras foi desenvolvido com foco em rápida experimentação.
Com Keras a prototipagem é rápida, além de contar com suporte a redes convolucionais e recorrentes, ou a combinação de ambos. Outra coisa importante é que roda na CPU ou na GPU, portanto qualquer um poderá experimentar, bastando um computador para isso.
A estrutura de dados do Keras é um model, um caminho de organizar as camadas. O tipo mais simples de model do Keras é o Sequential, uma pilha de camadas lineares (todos os conceitos relacionados serão descritos). Para arquiteturas complexas, o Keras oferece outros recursos.
O modelo de rede neural mais simples que existe é chamado "perceptron", formado por um único neurônio. Trata-se de uma árvore que possui os nós de entrada e uma única saída. A saída é conectada a cada um dos nós de entrada (a parte da somatória).
À esquerda são as entradas. Cada nó de entrada é associado a um valor numérico, que pode ser qualquer número real, podendo ser positivo ou negativo, inteiro ou decimal.
Cada nó de entrada tem um peso associado a ele, que também pode ser qualquer número real.
Após isso, todos os valores de entrada e seus pesos são inseridos na somatória.
O resultado será a entrada para uma função de ativação (activation), que é a função de x ($latex f(x)$). Nesse caso, x é o peso da somatório dos nós de entrada e suas conexões.
Para finalizar, o perceptron pode ter um parâmetro adicional chamado bias, que podemos considerar como o peso associado a um nó de entrada adicional que é permanentemente configurado para 1. Até então, esse parágrafo é só informativo.
É muito, muito comum encontrar modelos de redes neurais com a camada de entrada, uma ou duas intermediárias e a saída. Essas camadas intermediárias são chamadas de ocultas. Obviamente que com mais recursos, maior a complexidade.
Se você ainda não o fez, primeiro determinemos que ambiente será o seu. Pouco haverá de se fazer se for utilizar CPU, mas o desempenho é sofrível. Eu estou utilizando uma GPU modesta no meu notebook (GTX1050), mas com toda a certeza é melhor que usar CPU.
No artigo anterior, mostrei como configurar o CUDA, que é fundamental se estiver pensando em utilizar sua NVidia. Para pegar a cudnn, será necessário fazer um perfil no site da NVidia. Eu estou utilizando (para minhas experiências) um Debian em um container Docker. Já siga para esse artigo e veja como baixar a imagem e criar o container.
Será necessário adicionar o reposit ório para o CUDA Toolkit em seu sistema. Baixe o pacote no site da NVidia também. Eu peguei para Ubuntu 16.04, CUDA-10.
Depois de instalar o repositório, siga com o procedimento para a instalação do CUDA no sistema. Lá no site da NVidia terá o processo, mas para descrevê-lo, inclusa a instalação do driver:
apt-get install linux-headers-* nvidia-driver
dpkg -i cuda-repo-ubuntu1604_10.0.130-1_amd64.deb
apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
apt-get update
apt-get install cuda-toolkit-10-0
Lembre-se que primeiro o sistema nativo deve estar configurado, com driver de vídeo funcionando bonitinho. Com o comando nvidia-smi é possível ver o status da placa de vídeo e os processos que a estão utilizando, além da versão do driver e do CUDA. Estou utilizando a versão 410.79 do driver, com CUDA 10.0. Essa é a saída do comando:
Se você conseguiu chegar até aqui, ótimo, continue a leitura em seguida.
Após ter configurado o sistema e o container, o próximo passo é criar o virtualenv para trabalhar. Várias dependências serão percebidas conforme forem sendo requeridas, mas as mais problemáticas estou descrevendo aqui como referência.
Primeiro, instale o pacote python-pip, caso ainda não o tenha feito. Já aproveite para atualizá-lo (tudo dentro do container).
apt-get install python pip
pip install --upgrade pip
pip install virtualenv virtualenviwrapper
Já está instalado, agora é hora de criar um virtualenv. O virtualenv tem uma leve lembrança do chroot. Ele cria uma estrutura com todas as dependências básicas para utilizar Python. Depois, tudo que for relacionado ao seu projeto deve ser instalado dentro do virtualenv. Primeiro, crie um:
cd
virtualenv DobitAoByte
Depois, para migrar para dentro do virtualenv, utilize:
source /root/DobitAoByte/bin/activate
Aparecerá o nome do virtualenv criado no canto esquerdo da tela, o que lhe garantirá não estar trabalhando fora dele. Eu gosto de usar o bpython para prototipar código em Python, recomendo a instalação. Após estar dentro do virtualenv, instale-o com o gerenciador de pacotes Python que você instalou, como indicado mais acima:
pip install bpython
É uma dependência do TensorFlow. Para instalar o Bazel, é necessário ter o bash-completion. Depois, não lembro de onde baixei o pacote Bazel, mas é só caçar no google. Os dois passos (fora o download do pacote):
apt-get install bash-completion
dpkg -i bazel_0.21.0-linux-x86_64.deb
Como utilizaremos o TensorFlow como backend do Keras, será necessário instalá-lo. Compilar não é nada simples, enquanto eu estava no processo inicial pré-compilação, mais uma vez o Leonardo Lontra me deu um help voluntário passando essa dica preciosa. Esse pacote é para GPU:
pip install tf-nightly-gpu
Para não se deparar com muitos problemas, algumas dependências podem previamente ser eliminadas:
pip install pandas
pip install numpy scipy
pip install scikit-learn
pip install pillow
pip install h5py
pip install -U --user keras_preprocessing==1.0.5 --no-deps
pip install -U --user keras_applications==1.0.6 --no-deps
pip install -U pip six numpy wheel mock
pip install keras
apt-get install caffe-cuda
O café é por minha conta.
De dentro do virtualenv, agora abra o bpython e inclua o keras. Se algo der errado, resolva (haverá certamente uma série longa de dor e sofrimento até chegar nesse ponto). Se nada der errado, deve aparecer algo como:
Até aqui você já deve ter passado algumas horas com o artigo aberto no seu browser, se está pondo a mão na massa. Descanse, como eu também o farei. No próximo artigo pretendo fazer uma classificação para deixar como exemplo.
Inscreva-se no nosso canal Manual do Maker no YouTube.
Também estamos no Instagram.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.