Avançar para o conteúdo principal

Primeira abordagem a redes neurais

Primeira abordagem a redes neurais

Um pequeno relato desta primeira aventura. Com resultados abaixo do esperado.

Sendo o assunto da Inteligência Artificial um tema actual, resolvi começar a pesquisar alguma coisa... primeiro no Youtube. No youtube há muita coisa em diversos idiomas. Percebe-se que a Inteligência Artificial é como dizem alguns, um grande guarda chuva que acolhe muitas disciplinas.

Um dos vídeos mais interessantes é o do canal Ringa Tech, que usa Javascript e a biblioteca Brain.js para exemplificar de forma clara, uma rede neural simples, com cores de fundo e cores de texto.

https://www.youtube.com/watch?v=UNFFLJPW7KQ

Uma ideia de aplicação, seria determinar a distância de qualquer ponto de um triângulo ao seu centro de massa. Fiz uma janela em Python para depois iniciar sobre ela a rede neural:


Como estou a usar fundamentalmente o Python na programação, tentei fazer a correspondência para esta linguagem. O Brains.js não tem equivalente simples que eu encontrasse. Tentei instalar o Tensorflow (não funciona no meu computador por ter um processador antigo), depois a Anaconda que supostamente tem uma versão do Tensorflow mais antiga (Anaconda é um pacote de "utilidades" para o Python que não consegui por a funcionar.
Outra opção seria o Colab do Google, mas este não aceita o ambiente gráfico Tkinter.

Então resolvi virar-me para o Javascript. Aproveitei o código que está no GitHub do Ringa Tech e fui modificando o código.
O primeiro passo foi criar um canvas e uns textos para comunicar os resultados ao utilizador.
A mecânica de funcionamento é igual à ideia inicial de Python (no python nem precisava de clicar...), um clique no ecrã determina as coordenadas e depois sobre elas calcular a distância ao centro de massa.

Com o canvas e os textos a indicarem as coordenadas e o cálculo matemático (por fórmulas sem rede neural), o passo seguinte é analisar o problema.

Como inputs dei as coordenadas dos 3 vértices e as respectivas distâncias ao centro de massa, divididos pela dimensão do canvas, 600 pixeis. E ainda o ponto do centro com distância zero.

{input: [50/600,50/600], output: [0.5003]},
{input: [550/600,50/600], output: [0.5003]},
{input: [300/600,550/600], output: [0.556]},
{input: [300/600,216.67/600], output: [0.000]},

Agora ao correr o programa, vejo a imprecisão do output.

Na imagem da esquerda, cliquei perto do centro (tem um círculo para que se referencie com o rato) e na imagem direita cliquei perto do vértice do lado direito.

Veja-se que os cálculos matemáticos estão aproximados, de acordo com a capacidade de com o rato clicarmos no sítio exacto...
E no cálculo neural já temos uma boa dose de erro principalmente no centro e no vértice inferior.

A explicação pode passar pelo facto de esta não ser uma aplicação típica de uma rede neural? Ou por poucos pontos de treino / input para o modelo?
Ou como estamos a lidar com números entre 0 e 1 para os pesos do input e output, junto com a precisão do rato, obtemos um bom grau de incerteza. Uma opção aqui poderia ser a introdução de coordenadas pelo utilizador...
A explicação que vi no site :

https://codingthesmartway.com/beginners-guide-to-neural-networks-in-javascript-with-brain-js/

Parece-me lógica de acordo com as premissas das redes neurais:

The reason for this is that the neural network is not dealing with a fixed algorithm to solve the problem. Instead the neural network is learning based on the provided sample data and performing it’s internal computation of the basis of probabilities.

Como primeira abordagem serviu para ter uma noção da mecânica da rede, mas também deu para ter uma ideia da imprecisão que obti, e de quanto se pode tornar complexa a implementação de uma rede neural (com Pytorch ou Tensorflow).

Comentários

Mensagens populares deste blogue

ISPOL - Representação de Gabaris

ISPOL - Representação de Gabaris No ISPOL podemos representar ao longo do traçado um contorno e até realizar variações. A representação de um contorno ou gabari pode ser realizada no ISPOL de um modo simples, usando por exemplo um Símbolo (bloco) da biblioteca, ou um ou vários criados à medida para atender aos casos necessários. Na imagem abaixo um exemplo da biblioteca do ISPOL, representado no perfil transversal. Estas secções são constituídas por símbolos/blocos: Podem-se desenhar ao longo do eixo proporcionando a vista típica destas situações, uma espécie de sólido que enche o traçado. Além desta representação "simples" o ISPOL permite realizar transições entre símbolos diferentes, por exemplo para representar os diferentes gabaris em recta e curva. Ou outras situações que se achem necessárias. Permite ainda condicionar a representação destes símbolos por valores de raio. Isto é para um determinado raio. Pode ser usado para indicar de forma automática ao programa que em r...

Python - Automatização em ISPOL

Python - Automatização em ISPOL Com o uso de PyAutoGui podemos automatizar tarefas repetitivas no ISPOL ISTRAM. No trabalho actual, é necessário converter mais de 300 ficheiros. Já houve um trabalho prévio de ler e transformar dados de directrizes em Excel para ficheiros compatíveis com a conversão presente. Este trabalho prévio foi também feito com programação. Tendo os muitos ficheiros com formato TXT que o ISPOL pode ler e converter para CEJ, é necessário ir ao menu de Conversores do ISTRAM e digitar os dados para ler a localização dos ficheiros, número de eixo etc... um trabalho repetitivo. Sendo repetitivo uma hipótese que deve surgir é se existe forma de automatizar / programar. O ISTRAM ISPOL não permite o uso de plugins (como o CAD), por tanto a via seria pela automatização dos movimentos. O pacote PyAutoGUI para Python permite esta simulação de movimentos. https://pyautogui.readthedocs.io/en/latest/ Basicamente "guiamos" o cursor para onde deve clicar e o que introdu...

Python - Larguras de vias em Excel para ISPOL

Python - Larguras de vias em Excel para ISPOL Uma das formas de organizar a informação é usar o Excel. O ISPOL sendo um software em que muita informação é indicada de forma paramétrica, pode gerar alguma dificuldade ou confusão, quando há muitos dados. É o caso das larguras de vias, quando há vias de aceleração ou abrandamento, e diversas situações de vias adicionais. Uma forma de contornar alguma dificuldade é organizar a informação em quadros Excel. O Excel não comunica com o ISPOL, por isso arranja-se um canal de comunicação, a programação em Python. Com alguma experiência na programação, criar um script que realize o que pretendemos não leva assim tanto tempo. Como primeiro passo, ter um ficheiro de Excel com a informação estruturada. Os dados principais podem ser introduzidos com leituras de PKDist do ISPOL e copiados para o Excel. Pode-se ter umas fórmulas nas células para calcular as transições. Cada folha de Excel é relacionada a um eixo. O script ao início pede o número de eix...