-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathANN.m
89 lines (77 loc) · 2.8 KB
/
ANN.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
function [NET, OUTPUTS, ERRORS, RMSE, TR] = ANN(hiddenSizes,X,T,BP,ACT,DivideData)
% ANN Recebe 5 variáveis de entrada, a quantidade de neurônios e camadas
% da rede hiddenSizes, variáveis de entrada X, alvos da rede neural T, a
% função de ativação ACT, o algoritmo de backpropagation BP e a divisão dos
% dados de entrada DivideData, e retorna a rede após o treinamento, a
% saída calculada com a rede neural OUTPUTS, o erro em relação a saida da
% rede neural e o alvo ERRORS, a raiz do erro médio quadrático RMSE e, por
% fim, o registro do treinamento TR.
%
% ENTRADAS:
% hiddenSizes = Neurônios a serem usados na rede neural, seja com uma
% ou mais camadas ocultas.Ex: [1 3].
%
% X = Uma matriz R x Q.
% T = Uma matriz U x Q.
% Onde:
% Q = Número de amostras
% R = Número de elementos de entrada
% U = Numero de elementos de saída
%
% BP = Algorítimo de backpropagation. (Padrão = 'trainlm')
% http://bit.ly/MultilayerNeuralNetwork
%
% ACT = Função de ativação da rede neural.(Padrão = 'tansig')
% http://bit.ly/NeuralNetworkActivation
%
% DivideData = Porcentagem dos dados entre treino, validação e teste.
% Formato [60 20 20]. (Padrão = [70 15 15])
%
% SAÍDAS:
% NET = Retorna a rede neural treinada como um objeto _network_
% OUTPUTS = Retorna os resultados obtido pela rede neural como uma matriz
% U x Q.
% ERRORS = Erro entre os valores alvo e os resultados da rede neural como
% uma matriz U x Q
% RMSE = Retorna raiz do erro médio quadrático como valor
% numérico.
% TR = Retorna os dados do treinamento como _struct_
if nargin < 4
BP = 'trainlm';
ACT = 'tansig';
end
if nargin < 5
ACT = 'tansig';
end
if nargin < 6
DivideData = [];
end
%% =========== ANN =============
%Inicializa a rede neural para regressão
NET = fitnet(hiddenSizes, BP);
%Define a função de ativação
for i = 1:length(hiddenSizes)
NET.layers{i}.transferFcn = ACT;
end
if ~isempty(DivideData)
NET.divideParam.trainRatio = DivideData(1);
NET.divideParam.valRatio = DivideData(2);
NET.divideParam.testRatio = DivideData(3);
end
%Para o caso da escolha da função de ativação sigmoid são definidos os
%valores da normalização dos dados para o intervalo de saida da função
%sigmoid [0 , 1].
if isequal(ACT,'logsig')
saida = length(hiddenSizes) + 1;
NET.inputs{1}.processParams{2}.ymin = 0;
NET.outputs{saida}.processParams{2}.ymin = 0;
end
% Os valores padrão já estão dentro do intervalo para a função tangente
% hiperbólica [-1, 1] portanto não precosa ser mudado
%Treina a rede neural
[NET,TR] = train(NET,X,T,'useParallel','yes');
%Calculos dos valores obtidos pela rede neural
OUTPUTS = NET(X);
ERRORS = gsubtract(T,OUTPUTS);
RMSE = sqrt(mean((ERRORS).^2));
end