Desenvolvimento

20 jun, 2016

Redes neurais em JavaScript

Publicidade

As redes neurais fornecem a possibilidade de resolver problemas não lineares complicados. Elas podem ser utilizadas em diversas áreas, tais como classificação de sinal, timeseries de previsão e de reconhecimento de padrões. Uma rede neural é um modelo inspirado no cérebro humano e consiste em vários neurônios conectados. A rede é constituída por uma camada de neurônios de entrada (onde a informação entra), uma camada de neurônios de saída (onde o resultado pode ser retirado) e várias chamadas com camadas escondidas entre si:

redes-1

Para obter uma compreensão mais profunda, eu recomendo dar uma olhada em Neural Networks e Deep Learning.

Nos últimos anos, vários frameworks JavaScript foram desenvolvidos que podem ajudar você a criar, treinar e usar redes neurais para diferentes fins. Neste artigo, você vai aprender como configurar uma rede e usá-la para a classificação de imagens.

Um exemplo comum para começar a trabalhar com redes neurais é a classificação de dígitos escritos à mão. Para alcançar bons resultados, uma rede tem que ser treinada adequadamente. Portanto, precisamos de um conjunto de dados chamado de conjunto de treinamento. No nosso exemplo, vamos usar os números MNIST, um conjunto de milhares de imagens binárias 28x28px de números escritos à mão de 0 a 9:

redes-2

O banco de dados MNIST contendo 60.000 exemplos para treinamento e 10.000 exemplos de teste pode ser baixado no website da LeCun. Em vez de baixar o banco de dados e converter os dados para imagens reais, podemos usar os dígitos da biblioteca MNIST, que criam conjuntos de teste e de treinamento automaticamente.

const mnist = require('mnist'); 

const set = mnist.set(700, 20);

const trainingSet = set.training;
const testSet = set.test;

O código acima cria um conjunto de treinamento de 700 imagens e um de teste com 20 elementos. Ao criar os conjuntos manualmente, é importante se certificar de que não existem elementos duplicados nos conjuntos. Se você estiver usando a biblioteca de dígitos MNIST, isso é verificado automaticamente.

Depois de criar os dados para treinamento e testes, podemos configurar a rede. Usaremos a biblioteca synaptic.js, que nos dá a possibilidade de criar uma rede neural e configurar vários parâmetros. Primeiro de tudo, nós temos que determinar quantos neurônios de entrada e de saída serão necessários. Já que o tamanho de cada imagem é 28x28px, o número de pixels que a rede tem de tomar como entrada é 28 x 28 = 784. Os dígitos devem ser atribuídos a uma das dez classes, de modo que o número de neurônios de saída será 10. Além disso, a rede deve ter, pelo menos, uma camada oculta, a qual neste exemplo é definida para consistir de 100 neurônios.

O código a seguir configura a rede descrita acima:

const synaptic = require('synaptic');

const Layer = synaptic.Layer;
const Network = synaptic.Network;
const Trainer = synaptic.Trainer;

const inputLayer = new Layer(784);
const hiddenLayer = new Layer(100);
const outputLayer = new Layer(10);

inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);

const myNetwork = new Network({
    input: inputLayer,
    hidden: [hiddenLayer],
    output: outputLayer
});

Para treinar a rede com o nosso conjunto de treinamento, podemos usar o instrutor fornecido pelo synaptic.js. A função train() recebe os dados utilizados para o treinamento e uma lista de parâmetros para a configuração do treinador.

const trainer = new Trainer(myNetwork);
trainer.train(trainingSet, {
    rate: .2,
    iterations: 20,
    error: .1,
    shuffle: true,
    log: 1,
    cost: Trainer.cost.CROSS_ENTROPY
});

Como opções, você pode definir a ‘rate’, que é a taxa de aprendizagem para o treinamento. As ‘iterações’ definem, após quantas iterações o treinamento determina. O ‘error’ é o erro mínimo que pode ser alcançado durante o treinamento; se for alcançado, o treinamento para. Ao definir a opção ‘Shuffle’, você pode especificar se o conjunto de treinamento é ordenado de forma aleatória ou não. Você pode encontrar informações mais detalhadas sobre todas as opções possíveis na documentação do synaptic.js.

Para obter a ideia geral, neste exemplo definimos o número máximo de iterações para 20 para nos certificarmos de que não temos que esperar horas antes que o treinamento seja concluído. Perceba que a rede não será muito bem treinada após somente 20 iterações. Para obter melhores resultados, você terá que aumentar o número e ser paciente.

Se você quiser ver o progresso do treinamento, pode usar a opção ‘log’ para imprimir o erro atual da rede. Quanto mais baixo for o erro, melhor a rede está treinada.

redes-3

Você pode notar que o erro oscila um pouco em vez de diminuir constantemente, mas, no geral, fica menor. Se esse não for o caso, você pode tentar trabalhar com uma taxa de aprendizagem menor.

Depois que o treinamento for concluído, o conjunto de teste pode ser usado para verificar quão bem a classificação pela rede funciona. Para isso, podemos utilizar a função activate() da rede, o que leva o elemento a classificar como parâmetro. Para verificar o resultado, ele pode ser impresso e comparado com o resultado esperado.

console.log(myNetwork.activate(testSet[0].input));
console.log(testSet[0].output);

Por favor, note que os resultados alcançados pela rede nesse exemplo não são ótimos. Apenas cerca de 50% dos elementos no conjunto de treinamento foram classificados corretamente. Isso acontece por causa do pequeno conjunto de treinamento e do baixo número de iterações usadas no treinamento. Para melhorar os resultados, o número de elementos no conjunto de treinamento e as iterações para o treinamento devem ser aumentadas. Aviso: isso fará com que o treinamento demore um pouco mais de tempo!

Além do exemplo comum MNIST, existem muitas outras aplicações em que as redes neurais podem ser úteis. Outra experiência interessante que usa synaptic.js é o T-Rex ML Player, no qual uma rede neural aprende o jogo T-Rex.

Se você quiser dar uma olhada em bibliotecas JavaScript similares para a criação de redes neurais, aqui estão alguns outros projetos que você deve verificar:

***

Christine Wiederer faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: http://blog.webkid.io/neural-networks-in-javascript/