Arquivo .m com RNA
by
vitor
—
last modified
2009-01-14 00:21
Roda no Matlab
Size 6.3 kB - File type text/x-objcsrcFile contents
echo on
clear
% =================================================================
% Aula Pratica de Redes Neurais
% Akio Yamazaki
% (Treina e testa uma rede MLP)
% =================================================================
% Informacoes sobre a rede e os dados
numEntradas = 35; % Numero de nodos de entrada
numEscondidos = 10; % Numero de nodos escondidos
numSaidas = 2; % Numero de nodos de saida
numTr = 460; % Numero de padroes de treinamento
numVal = 230; % Numero de padroes de validacao
numTeste = 230; % Numero de padroes de teste
echo off
% Abrindo arquivos
arquivoTreinamento = fopen('Treinamento.txt','rt');
arquivoValidacao = fopen('Validacao.txt','rt');
arquivoTeste = fopen('Teste.txt','rt');
% Lendo arquivos e armazenando dados em matrizes
dadosTreinamento = fscanf(arquivoTreinamento,'%f',[(numEntradas + numSaidas), numTr]); % Lendo arquivo de treinamento
entradasTreinamento = dadosTreinamento(1:numEntradas, 1:numTr);
saidasTreinamento = dadosTreinamento((numEntradas + 1):(numEntradas + numSaidas), 1:numTr);
dadosValidacao = fscanf(arquivoValidacao,'%f',[(numEntradas + numSaidas), numVal]); % Mesmo processo para validacao
entradasValidacao = dadosValidacao(1:numEntradas, 1:numVal);
saidasValidacao = dadosValidacao((numEntradas + 1):(numEntradas + numSaidas), 1:numVal);
dadosTeste = fscanf(arquivoTeste,'%f',[(numEntradas + numSaidas), numTeste]); % Mesmo processo para teste
entradasTeste = dadosTeste(1:numEntradas, 1:numTeste);
saidasTeste = dadosTeste((numEntradas + 1):(numEntradas + numSaidas), 1:numTeste);
% Fechando arquivos
fclose(arquivoTreinamento);
fclose(arquivoValidacao);
fclose(arquivoTeste);
% Criando a rede (para ajuda, digite 'help newff')
for entrada = 1 : numEntradas; % Cria 'matrizFaixa', que possui 'numEntradas' linhas, cada uma sendo igual a [0 1].
matrizFaixa(entrada,:) = [0 1];
end
rede = newff(matrizFaixa,[numEscondidos numSaidas],{'logsig','logsig'},'traingd','learngd','sse');
% matrizFaixa : indica que todas as entradas possuem valores na faixa entre 0 e 1
% [numEscondidos numSaidas] : indica a quantidade de nodos escondidos e de saida da rede
% {'logsig','logsig'} : indica que os nodos das camadas escondida e de saida terao funcao de ativacao sigmoide logistica
% 'traingdm','learngdm' : indica que o treinamento vai ser feito com gradiente descendente (backpropagation)
% 'sse' : indica que o erro a ser utilizado vai ser SSE (soma dos erros quadraticos)
% Inicializa os pesos da rede criada (para ajuda, digite 'help init')
rede = init(rede);
% Parametros do treinamento (para ajuda, digite 'help traingd')
rede.trainParam.epochs = 10000; % Maximo numero de iteracoes
rede.trainParam.lr = 0.005; % Taxa de aprendizado
rede.trainParam.goal = 0; % Criterio de minimo erro de treinamento
rede.trainParam.max_fail = 5; % Criterio de quantidade maxima de falhas na validacao
rede.trainParam.min_grad = 0; % Criterio de gradiente minimo
rede.trainParam.show = 10; % Iteracoes entre exibicoes na tela (preenchendo com 'NaN', nao exibe na tela)
rede.trainParam.time = inf; % Tempo maximo (em segundos) para o treinamento
fprintf('\nTreinando ...\n')
conjuntoValidacao.P = entradasValidacao; % Entradas da validacao
conjuntoValidacao.T = saidasValidacao; % Saidas desejadas da validacao
% Treinando a rede
[redeNova,desempenho,saidasRede,erros] = train(rede,entradasTreinamento,saidasTreinamento,[],[],conjuntoValidacao);
% redeNova : rede apos treinamento
% desempenho : apresenta os seguintes resultados
% desempenho.perf - vetor com os erros de treinamento de todas as iteracoes (neste exemplo, escolheu-se erro SSE)
% desempenho.vperf - vetor com os erros de validacao de todas as iteracoes (idem)
% desempenho.epoch - vetor com as iteracoes efetuadas
% saidasRede : matriz contendo as saidas da rede para cada padrao de treinamento
% erros : matriz contendo os erros para cada padrao de treinamento
% (para cada padrao: erro = saida desejada - saida da rede)
% Obs. : Os dois argumentos de 'train' preenchidos com [] apenas sao utilizados quando se usam delays
% (para ajuda, digitar 'help train')
fprintf('\nTestando ...\n');
% Testando a rede
[saidasRedeTeste,Pf,Af,errosTeste,desempenhoTeste] = sim(redeNova,entradasTeste,[],[],saidasTeste);
% saidasRedeTeste : matriz contendo as saidas da rede para cada padrao de teste
% Pf,Af : matrizes nao usadas neste exemplo (apenas quando se usam delays)
% errosTeste : matriz contendo os erros para cada padrao de teste
% (para cada padrao: erro = saida desejada - saida da rede)
% desempenhoTeste : erro de teste (neste exemplo, escolheu-se erro SSE)
fprintf('SSE para o conjunto de treinamento: %6.5f \n',desempenho.perf(length(desempenho.perf)));
fprintf('SSE para o conjunto de validacao: %6.5f \n',desempenho.vperf(length(desempenho.vperf)));
fprintf('SSE para o conjunto de teste: %6.5f \n',desempenhoTeste);
% Calculando o erro de classificacao para o conjunto de teste
% (A regra de classificacao e' winner-takes-all, ou seja, o nodo de saida que gerar o maior valor de saida
% corresponde a classe do padrao).
% Obs.: Esse erro so' faz sentido se o problema for de classificacao. Para problemas que nao sao de classificacao,
% esse trecho do script deve ser eliminado.
[maiorSaidaRede, nodoVencedorRede] = max (saidasRedeTeste);
[maiorSaidaDesejada, nodoVencedorDesejado] = max (saidasTeste);
% Obs.: O comando 'max' aplicado a uma matriz gera dois vetores: um contendo os maiores elementos de cada coluna
% e outro contendo as linhas onde ocorreram os maiores elementos de cada coluna.
classificacoesErradas = 0;
for padrao = 1 : numTeste;
if nodoVencedorRede(padrao) ~= nodoVencedorDesejado(padrao),
classificacoesErradas = classificacoesErradas + 1;
end
end
erroClassifTeste = 100 * (classificacoesErradas/numTeste);
fprintf('Erro de classificacao para o conjunto de teste: %6.5f\n',erroClassifTeste);
Click here to get the file