Redes Neurais: Do reconhecimento de caracteres para o reconhecimento de ruas (parte 2)

Continuando…

Vou pegar as fotos que tirei das ruas, converter cada uma em uma coluna da matriz, e indicar (na matriz de saída, T) quais colunas/imagens representam ruas curvas para esquerda, ou curvas para direita (vou ignorar ruas retas em um primeiro momento pra facilitar).

Ah, e uma ideia que tive pra dobrar o número de fotos de ruas curvas que tenho: pegar cada foto e inverter horizontalmente… XD Assim de toda curva para um lado, tenho também a mesma curva para ou outro lado :) Apesar de suspeitar que isso pode ser de ajuda pra rede neural entender melhor as curvas para ambos os lado, também acho que eu deveria, no futuro, ter um banco de dados de curva “mostruoso”, muito grande, para fazer algo mais sério. Mas vamos começar com poucas (até por limitações de memória do meu PC).

% imagens 48x36

r11 = imread('low-resolution\new-e1.jpg');
r12 = imread('low-resolution\new-e2.jpg');
r13 = imread('low-resolution\new-e3.jpg');
r14 = imread('low-resolution\new-e4.jpg');
r15 = imread('low-resolution\new-e5.jpg');

r21 = imread('low-resolution\new-d1.jpg');
r22 = imread('low-resolution\new-d2.jpg');
r23 = imread('low-resolution\new-d3.jpg');
r24 = imread('low-resolution\new-d4.jpg');
r25 = imread('low-resolution\new-d5.jpg');

% convertendo em cinza

r11g = rgb2gray(r11);
r12g = rgb2gray(r12);
r13g = rgb2gray(r13);
r14g = rgb2gray(r14);
r15g = rgb2gray(r15);

r21g = rgb2gray(r21);
r22g = rgb2gray(r22);
r23g = rgb2gray(r23);
r24g = rgb2gray(r24);
r25g = rgb2gray(r25);

% colunas [5184x1]

cr11 = r11(:);
cr12 = r12(:);
cr13 = r13(:);
cr14 = r14(:);
cr15 = r15(:);
cr21 = r21(:);
cr22 = r22(:);
cr23 = r23(:);
cr24 = r24(:);
cr25 = r25(:);

% criando a matriz com as colunas [5184x10]
ruas = [cr11,cr12,cr13,cr14,cr15,cr21,cr22,cr23,cr24,cr25]
% resultado
res = [0,0,0,0,0,1,1,1,1,1]

% treinando a rede com 2 neurônios - usa 2.9 GB de memória, a partir de 3 trava meu PC
net0 = feedforwardnet(2);
net1 = train(net0,ruas,res);

Como comentado no código acima, o máximo que meu PC suportou foram 2 neurônio, usando 2.9 GB de memória, com 3 já ocorre ‘out of memory’… O que me faz pensar, com nossos trilhões de neurônios, imagine quanta memória nosso cérebro não precisa… O_O :)

Resultados

Vou tentar fazer a leitura dos resultados aqui, com os conhecimentos que tenho hoje sobre o assunto. Devo ressaltar que eu “posso tá falando uma pá de merda… não seria minha primeira pá, nem minha última”[1], portanto leia e utilize sob sua conta e risco :)

Claro que não esperamos grande coisa de se treinar uma rede com apenas 10 imagens, e usando apenas 2 neurônios… Mas vamos lá… :)

Como a rede neural tem pesos iniciais aleatórios, foram feitos (quase escrevi “realizados”, deixa a formalidade pra monografia) 3 testes para pegar as diferenças.

Gráficos de performance:

01-performance

02-performance

03-performance

Depois da primeira época, a performance foi ladeira abaixo… XD

Na verdade, pelo que entendo desse gráfico, quanto mais baixo o valor melhor. Mas enquanto o erro do treino foi para praticamente nulo, o erro da validação e do teste ficaram sempre próximos de 1 (10 elevado à 0). Parece que o ponto selecionado foi onde havia a melhor proximidade entre os três [tarefa: revisar meu entendimento desse gráfico], e com o menor erro. Com isso já imaginei que o histograma de erros não ficaria muito bom…

Histogramas:

01-histogram

02-histogram

03-histogram

Até que ficou melhor do que eu esperava.

Os resultados possíveis são 0 (zero – curva para esquerda) ou 1 (um – curva para direita), e o histograma mostra a subtração [alvo – resultado]. O maior erro seria 1. Ou seja, um erro menor que 0,5 se arredondado, é um acerto.

E, pegando o primeiro dos três como exemplo, parece que metade dos testes caíram em cima do erro de 0,3. Já a validação caiu toda no erro de 0,6 o que representa 100% de erro de validação… #holyShit

Os outros não estão muito melhores. Mas isso é só um primeiro teste. Vamos adiante.

Gráficos de “training state” [estado do treino?]:

01-training-state

02-training-state

03-training-state

Esses também eu preciso revisar meu entendimento a respeito. Cada janela dessas está mostrando 3 gráficos, do qual eu só tenho noção do último, pelo nome mesmo “validation checks”, que mostra a cada época os erros aumentando, chegando próximo de 6 ou 7 na 7ª época.

Gráficos de regressão:

01-regression

E, por fim, esses eu também preciso revisar meu entendimento a respeito… XD É, tá complicado… Não me pergunte como eu cheguei ao mestrado… Já dizia um determinado livro de tecnologia “não é o que você sabe, é quando você sabe”, eu devo ter aprendido sobre esses gráficos, mas apaguei da memória… Agora vou ter que recuperar…

A seguir…

Apesar das anotações pra revisar meus conceitos sobre alguns gráficos, acho que há coisas mais importantes no momento. Apenas com o histograma já é possível ver que a rede está um lixo, e essa limitação de 2 neurônios está parecendo não só da rede, mas minha, por falta de saber como otimizar isso… XD Vou fazer alguns testes reduzindo ainda mais a resolução das imagens para ver se com isso posso aumentar o número de neurônios. E com minha qualificação chegando, talvez eu tenha alguma ajuda da banca (depois de ser espancado) sobre tudo isso.

Tudo isso e muito mais em postagens futuras. Ou não :)

[1] – Frase proferida por Sr. K, no nerdcast de dia dos namorados de 2013.

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s