Implementação de rede neural do zero
|
|
- Otávio Lacerda Teixeira
- 5 Há anos
- Visualizações:
Transcrição
1 Implementação de rede neural do zero Nesta apostila, vamos implementar uma rede neural desde o início, sem usar uma implementação pronta. Os exemplos utilizando as funções de rede neural de OpenCV estão nas apostilas "aprendizagem" e "mle_avancada". Vamos utilizar o material de dois sites: 1) Introdutória: 2) Avançada: Para acompanhar esta apostila, devem olhar ao mesmo tempo o material correspondente desses dois sites. 1
2 O site: [haewin/goodreader/algoritmos/deep/stepbystep.pdf] apresenta a simulação numérica de uma rede neural muito simples. Vamos compreender como funciona, fazendo a implementação em C++. Pesos iniciais da rede [mattmazur.com] Numa rede neural "normal", cada neurônio tem um bias. No exemplo do site, há um único "bias" para todos os neurônios de uma camada de rede. Os nós i1 e i2 (input) não fazem nada. Só pegam as entradas e passam para os nós da camada escondida (h1 e h2). Os nós h1, h2 (hidden), o1 e o2 (output) calculam a média ponderada das entradas pelos pesos wi, mais o bias. Depois, aplicam a função de ativação sigmóide. Considere o nó h1: net h1 = w1*i1 + w2*i2 + b1*1 out h1 = sigmoid(net h1 ) Funções "logistic" e "sigmoid" são a mesma coisa: f(x)= 1 / ( 1 + exp(-x) ) Logistic sigmoid function [extraído da Wikipedia]. 2
3 Outra função de ativação bastante usada é tangente hiperbólico: A função custo ou função erro é calculada: C=E total = 1 2 (target output)2 Vamos calcular a saída de rede neural para entrada (0.05, 0.10). A saída desejada para essa entrada é (0.01, 0.99). Vamos também calcular os erros. net_h1 = w1*i1+w2*i2+b1*1; net_h1 = 0.15* * *1 = out_h1 = logistic(net_h1); out_h1 = ; out_h2 = ; net_o1 = w5*out_h1+w6*out_h2+b2*1; net_o1 = 0.4* * *1 = ; out_o1 = logistic(net_o1); out_o1 = out_o2 = err_o1 = 0.5 * elev2(target_o1-out_o1); err_o1 = 0.5 * elev2( ) = ; err_o2 = err_total = err_o1+err_o2; err_total =
4 //step01.cpp #include <cekeikon.h> double i1=0.05, i2=0.10; double w1=0.15, w2=0.20, w3=0.25, w4=0.30, b1=0.35; double net_h1, net_h2, out_h1, out_h2; double w5=0.40, w6=0.45, w7=0.50, w8=0.55, b2=0.60; double net_o1, net_o2, out_o1, out_o2; double target_o1=0.01, target_o2=0.99; // saida desejada double err_o1,err_o2,err_total; double logistic(double x) { return 1 / ( 1 + exp(-x) ); void forward() { net_h1=w1*i1+w2*i2+b1*1; xprint(net_h1); out_h1=logistic(net_h1); xprint(out_h1); net_h2=w3*i1+w4*i2+b1*1; xprint(net_h2); out_h2=logistic(net_h2); xprint(out_h2); net_o1=w5*out_h1+w6*out_h2+b2*1; xprint(net_o1); out_o1=logistic(net_o1); xprint(out_o1); net_o2=w7*out_h1+w8*out_h2+b2*1; xprint(net_o2); out_o2=logistic(net_o2); xprint(out_o2); err_o1 = 0.5 * elev2(target_o1-out_o1); xprint(err_o1); err_o2 = 0.5 * elev2(target_o2-out_o2); xprint(err_o2); err_total = err_o1+err_o2; xprint(err_total); int main() { forward(); ~/haepi/deep/redeneural/stepbystep $ step01 net_h1 = out_h1 = net_h2 = out_h2 = net_o1 = out_o1 = net_o2 = out_o2 = err_o1 = err_o2 = err_total = Como era de se esperar, a saída bate perfeitamente com a simulação do site. 4
5 backpropagation [mattmazur.com] No backpropagation, queremos diminuir o erro ou o custo (diferença entre a saída da rede e a saída desejada). Para isso, devemos calcular as derivadas parciais da função custo C (ou erro E) em relação a cada peso e cada bias. Depois, movemos "um pouco" cada peso e cada bias no sentido contrário à sua derivada parcial para diminuir o erro. Para especificar "um pouco", utiliza-se a taxa de aprendizagem (learning rate) η. Learning rate é denotada por α no tiny_dnn. Backpropagation: De [ w k w' k =w k η C w k b l b' l =b l η C b l O próximo programa faz backpropagation dos neurônios da camada de saída (output). 5
6 //step02.cpp #include <cekeikon.h> double i1=0.05, i2=0.10; double w1=0.15, w2=0.20, w3=0.25, w4=0.30, b1=0.35; double net_h1, net_h2, out_h1, out_h2; double w5=0.40, w6=0.45, w7=0.50, w8=0.55, b2=0.60; double net_o1, net_o2, out_o1, out_o2; double target_o1=0.01, target_o2=0.99; // saida desejada double err_o1, err_o2, err_total; double w1p, w2p, w3p, w4p, w5p, w6p, w7p, w8p; double logistic(double x) { return 1 / ( 1 + exp(-x) ); void forward() { net_h1=w1*i1+w2*i2+b1*1; xprint(net_h1); out_h1=logistic(net_h1); xprint(out_h1); net_h2=w3*i1+w4*i2+b1*1; xprint(net_h2); out_h2=logistic(net_h2); xprint(out_h2); net_o1=w5*out_h1+w6*out_h2+b2*1; xprint(net_o1); out_o1=logistic(net_o1); xprint(out_o1); net_o2=w7*out_h1+w8*out_h2+b2*1; xprint(net_o2); out_o2=logistic(net_o2); xprint(out_o2); err_o1 = 0.5 * elev2(target_o1-out_o1); xprint(err_o1); err_o2 = 0.5 * elev2(target_o2-out_o2); xprint(err_o2); err_total = err_o1+err_o2; xprint(err_total); void backward() { double eta=0.5; double derr_dw5=-(target_o1-out_o1)*out_o1*(1-out_o1)*out_h1; xprint(derr_dw5); w5p = w5 - eta*derr_dw5; xprint(w5p); double derr_dw6=-(target_o1-out_o1)*out_o1*(1-out_o1)*out_h2; xprint(derr_dw6); w6p = w6 - eta*derr_dw6; xprint(w6p); double derr_dw7=-(target_o2-out_o2)*out_o2*(1-out_o2)*out_h1; xprint(derr_dw7); w7p = w7 - eta*derr_dw7; xprint(w7p); double derr_dw8=-(target_o2-out_o2)*out_o2*(1-out_o2)*out_h2; xprint(derr_dw8); w8p = w8 - eta*derr_dw8; xprint(w8p); int main() { forward(); backward(); Saída: ~/haepi/deep/redeneural/stepbystep $ step02 net_h1 = out_h1 = net_h2 = out_h2 = net_o1 = out_o1 = net_o2 = out_o2 = err_o1 = err_o2 = err_total = derr_dw5 = w5p = derr_dw6 = w6p = derr_dw7 = w7p = derr_dw8 = w8p = Não vamos fazer simulação para a camada escondida, mas os cálculos são semelhantes. 6
7 Livro online sobre rede neural e deep learning: [haewin/goodreader/algoritmos/deep/neural_network_and_deep_learning.pdf] traz uma descrição mais detalhada de como funciona uma rede neural. Esse livro traz os exemplos em Python. Vamos traduzir esses programas para C++ e verificar que os resultados são praticamente iguais aos das implementações em Python. Isto certificará que aprendemos corretamente os conceitos apresentados no livro. Os exemplos abaixo seguirão esse livro. O programa rede1 abaixo treina rede neural de 3 camadas com número de neurônios (2,2,2) para que a saída P=(P1, P2) para a entrada X=(0.05, 0.1) fique cada vez mais semelhante à saída ideal Y=(0.01, 0.99) - é o mesmo exemplo que estávamos tentando implementar antes. Inicializa pesos w e biases b com função gaussiana de média zero e desvio-padrão um. Repete 40 vezes: 1) Feed-forward. 2) Calcula erro. 3) Feed-backward. 4) Update weights and biases (gradient descent) Diferentemente do exemplo anterior, aqui cada neurônio tem um bias. Cada aresta tem um weight. Cada neurônio que não seja de entrada possui função de ativação sigmoide na saída. Quando tem somente uma amostra de treinamento, função custo ou função erro é: C(w,b)= y(x) a 2 x = amostra de entrada y = saída ideal a = saída gerada pelo algoritmo C(w 1,...,w K,b 1,...,b L )= ( C,..., C, C..., C T, w 1 w K b 1 b L ) w k w' k =w k η C w k b l b' l =b l η C b l 7
8 //rede1.cpp //Treina rede para que quando a entrada for X=(0.05, 0.1) //a saida seja Y=(0.01, 0.99) #include <cekeikon.h> float logistic(float x) { // Funcao logistic return 1 / ( 1 + exp(-x) ); Mat_<float> logistic(mat_<float> x) { // Calcula funcao logistic de cada elemento da matriz Mat_<float> y(x.size()); for (unsigned i=0; i<x.total(); i++) y(i)=logistic(x(i)); return y; float Dlogistic(float x) { // Derivada da funcao logistic float z=logistic(x); return z*(1-z); Mat_<float> Dlogistic(Mat_<float> x) { // Calcula derivada da funcao logistic para cada elemento da matriz Mat_<float> y(x.size()); for (unsigned i=0; i<x.total(); i++) y(i)=dlogistic(x(i)); return y; class RedeNeural { Mat_<int> nneuronio; vector< Mat_<float> > w; // pesos - um para cada aresta vector< Mat_<float> > b; // bias - um para cada neurônio exceto entrada public: RedeNeural(Mat_<int> _nneuronio); void train(mat_<float> x, Mat_<float> y); ; RedeNeural::RedeNeural(Mat_<int> _nneuronio) { // Cria redeneural com o numero de neuronios em cada camada // especificada pelo vetor _nneuronio // _nneuronio deve ter uma linha // e numero de colunas igual a numero de camadas da rede RNG r(7); r.next(); nneuronio=_nneuronio.clone(); w.resize(nneuronio.total()); // nao existe w[0] for (unsigned i=1; i<w.size(); i++) { w[i].create(nneuronio(i),nneuronio(i-1)); r.fill(w[i],rng::normal,0.0,1.0); b.resize(nneuronio.total()); // nao existe b[0] for (unsigned i=1; i<b.size(); i++) { b[i].create(nneuronio(i),1); r.fill(b[i],rng::normal,0.0,1.0); void RedeNeural::train(Mat_<float> x, Mat_<float> y) { // Treina rede neural para que a saida de x concorde com y vector< Mat_<float> > a(nneuronio.total()); // valores dos neurônios antes de sigmoide // a[0] = x vector< Mat_<float> > z(nneuronio.total()); // valores dos neurônios depois de sigmoide // Nao existe z[0] vector< Mat_<float> > delta(nneuronio.total()); for (unsigned passo=0; passo<40; passo++) { //======== feed forward ================= a[0]=x.clone(); for (unsigned i=1; i<a.size(); i++) { z[i]=w[i]*a[i-1]+b[i]; a[i]=logistic(z[i]); //========= calcula erro ======================== int L=a.size()-1; printf("passo=%-5d erro=%9.6f\n",passo,norm(a[l]-y)); //cout << "Erro: " << norm(a[l]-y) << endl; //========== feed backward (cap 2, BP1 e BP2) ====================== 8
9 multiply( a[l]-y, Dlogistic(z[L]), delta[l]); // (BP1) for (unsigned i=l-1; i>0; i--) multiply( w[i+1].t()*delta[i+1], Dlogistic(z[i]), delta[i]); // (BP2) //============== update weights and biases (cap 2, BP3 e BP4) ================== float eta=3.0; for (unsigned i=l; i>0; i--) { w[i] = w[i] - eta * delta[i]*a[i-1].t(); // (BP4) b[i] = b[i] - eta * delta[i]; // (BP3) int main() { Mat_<float> x = ( Mat_<float>(2,1) << 0.05, 0.1 ); Mat_<float> y = ( Mat_<float>(2,1) << 0.01, 0.99 ); Mat_<int> v = (Mat_<int>(1,3) << 2,2,2); RedeNeural ind(v); ind.train(x,y); O vetor de matrizes w armazena os pesos das arestas. O vetor de vetores b armazena os bias dos neurônios. Os elementos w[0] e b[0] não existem (começam a ser usados a partir do índice 1). O vetor de vetores z armazena os valores de saída dos neurônios, antes de calcular a função de ativação sigmóide. O vetor de vetores a armazena os valores de saída dos neurônios, após calcular a função de ativação sigmóide. a[0] contém os valores de entrada da rede neural. A função multiply efetua multiplicação de Hadamard (elemento a elemento). 9
10 Os erros L2 obtidos são: passo=0 erro= passo=1 erro= passo=2 erro= passo=3 erro= passo=4 erro= passo=32 erro= passo=33 erro= passo=34 erro= passo=35 erro= passo=36 erro= passo=37 erro= passo=38 erro= passo=39 erro= Note que o erro diminui com o número de iterações. Backpropagation: Equações do livro: Equações adaptadas para o programa: De [neuralnetworksanddeeplearning.com]. δ L =(a L y) σ ' (z L ) (BP1) L é a última camada. Multiplicação de Hadamard (elemento a elemento). σ é a derivada do sigmoide. δ l =((w l 1 ) T δ l +1 ) σ ' (z l ) (BP2) l é camada interior de rede neural (exceto a última). w l =w l ηδ l (a l 1 ) T (BP4) η é a taxa de aprendizagem b l =b l ηδ l (BP3) 10
11 Cada amostra de treinamento gera um erro. É possível calcular as derivadas parciais dessa função erro em relação à cada peso e bias. Backpropagation minimiza o erro fazendo pesos e bias andar no sentido contrário às derivadas parciais. Quando tem duas ou mais amostras de treinamento, é necessário calcular média da função custo para todas as amostras. E calcular as derivadas parciais (em relação à w e b) dessa média da função custo. C(w,b)= 1 2n x y(x) a 2 x = amostra de entrada y = saída ideal a = saída gerada pelo algoritmo n = número de amostras Dw[l] é a somatória para todas as amostras de treinamento: (D w ) l = (x, y) δ l (a l 1 ) T (BP5) Db[l] é a somatória para todas as amostras de treinamento: (D b ) l = (x, y) δ l (BP6) O programa rede3 abaixo treina rede neural de 3 camadas com número de neurônios (2,2,2) para que a saída P=(P1, P2) para a entrada X=(0.9, 0.1) seja Y=(0.1, 0.9) e a saída para entrada X=(0.1, 0.9) seja Y=(0.9, 0.1). Repete 200 vezes: Repete para cada uma das duas amostras: 1) Feed-forward. 2) Calcula erro. 3) Feed-backward. 4) Update weights and biases (gradient descent), tirando a média dos dois gradientes (para as duas amostras de treinamento). Para a entrada: 0.9, 0.1, 0.1, 0.9, 0.8, 0.0, 0.2, 0.9 A saída obtida é: [ , ; , ; , ; , ] 11
12 //rede3.cpp //Treina rede neural de 3 camadas com número de neurônios (2,2,2) //para que a saída para a entrada X=(0.9, 0.1) seja Y=(0.1, 0.9) //e a saída para entrada X=(0.1, 0.9) seja Y=(0.9, 0.1). #include <cekeikon.h> float logistic(float x) { return 1 / ( 1 + exp(-x) ); Mat_<float> logistic(mat_<float> x) { Mat_<float> y(x.size()); for (unsigned i=0; i<x.total(); i++) y(i)=logistic(x(i)); return y; float Dlogistic(float x) { float z=logistic(x); return z*(1-z); Mat_<float> Dlogistic(Mat_<float> x) { Mat_<float> y(x.size()); for (unsigned i=0; i<x.total(); i++) y(i)=dlogistic(x(i)); return y; class RedeNeural { Mat_<int> nneuronio; vector< Mat_<float> > w; vector< Mat_<float> > b; public: RedeNeural(Mat_<int> _nneuronio); void train(mat_<float> ax, Mat_<float> ay); Mat_<float> predict(mat_<float> qx); ; RedeNeural::RedeNeural(Mat_<int> _nneuronio) { RNG r(18); r.next(); nneuronio=_nneuronio.clone(); w.resize(nneuronio.total()); // nao existe w[0] for (unsigned i=1; i<w.size(); i++) { w[i].create(nneuronio(i),nneuronio(i-1)); r.fill(w[i],rng::normal,0.0,1.0); b.resize(nneuronio.total()); // nao existe b[0] for (unsigned i=1; i<b.size(); i++) { b[i].create(nneuronio(i),1); r.fill(b[i],rng::normal,0.0,1.0); void RedeNeural::train(Mat_<float> ax, Mat_<float> ay) { int L=nNeuronio.total()-1; // Indice da ultima camada da rede if (ax.cols!=nneuronio(0)) erro("erro: Dimensao entrada"); if (ay.cols!=nneuronio(l)) erro("erro: Dimensao saida"); if (ax.rows!=ay.rows) erro("erro: Amostras ax!= amostras ay"); int N=ax.rows; // Numero de amostras vector< Mat_<float> > a(nneuronio.total()); vector< Mat_<float> > z(nneuronio.total()); vector< Mat_<float> > delta(nneuronio.total()); vector< Mat_<float> > Dw(nNeuronio.total()); vector< Mat_<float> > Db(nNeuronio.total()); for (unsigned passo=0; passo<200; passo++) { for (unsigned s=0; s<n; s++) { //======== feed forward ================= a[0]=ax.row(s).t(); for (unsigned i=1; i<a.size(); i++) { z[i]=w[i]*a[i-1]+b[i]; a[i]=logistic(z[i]); //========== feed backward ====================== multiply( a[l]-ay.row(s).t(), Dlogistic(z[L]), delta[l]); // (BP1) for (unsigned i=l-1; i>0; i--) { multiply( Mat_<float>(w[i+1].t()*delta[i+1]), Dlogistic(z[i]), delta[i]); // (BP2) 12
13 for (unsigned i=l; i>0; i--) { // (BP5) (BP6) if (s==0) { Dw[i] = delta[i]*a[i-1].t(); Db[i] = delta[i]; else { Dw[i] += delta[i]*a[i-1].t(); Db[i] += delta[i]; //============== update weights and biases ================== float eta=3.0; for (unsigned i=l; i>0; i--) { w[i] = w[i] - (eta/n) * Dw[i]; // (BP4) b[i] = b[i] - (eta/n) * Db[i]; // (BP3) Mat_<float> RedeNeural::predict(Mat_<float> qx) { if (qx.cols!=nneuronio(0)) erro("erro: Dimensao entrada"); int L=nNeuronio.total()-1; // Indice da ultima camada da rede int N=qx.rows; // Numero de amostras Mat_<float> qp(n,nneuronio(l)); vector< Mat_<float> > a(nneuronio.total()); vector< Mat_<float> > z(nneuronio.total()); for (unsigned s=0; s<n; s++) { a[0]=qx.row(s).t(); for (unsigned i=1; i<a.size(); i++) { z[i]=w[i]*a[i-1]+b[i]; a[i]=logistic(z[i]); qp.row(s)=a[l].t(); return qp; int main() { Mat_<float> ax = ( Mat_<float>(2,2) << 0.9, 0.1, 0.1, 0.9 ); Mat_<float> ay = ( Mat_<float>(2,2) << 0.1, 0.9, 0.9, 0.1 ); Mat_<int> v = (Mat_<int>(1,3) << 2,2,2); RedeNeural ind(v); ind.train(ax,ay); Mat_<float> qx = ( Mat_<float>(4,2) << 0.9, 0.1, 0.1, 0.9, 0.8, 0.0, 0.2, 0.9 ); Mat_<float> qp=ind.predict(qx); cout << qp << endl; 13
14 Stochastic gradient descent (SGD): Algoritmo de backpropagation faz: w k w' k =w k η C w k b l b' l =b l η C b l onde o custo C é o erro médio L2 para todas as amostras de treinamento. Para calcular gradiente C, é necessário calcular o gradiente C x com respeito a cada amostra de treinamento x e tirar média delas: C= 1 n ( x C x ). Quando a quantidade de amostras de treinamento é grande, demora muito tempo para calcular e fazer uma única descida de gradiente. No stochastic gradient descent, estima-se o gradiente C calculando C x para um pequeno número de amostras de treinamento x escolhidos aleatoriamente. Estas amostras de treinamento escolhidos aleatoriamente são chamados de mini-batch. Um epoch de treinamento é quando usamos todas as amostras de treinamento (divididos em minibatches) para fazer descida de gradiente. Exemplo: Suponha que queiramos treinar uma rede neural para reconhecer dígitos manuscritos usando o banco de imagens MNIST que possui amostras de treinamento. Treinar 30 epochs com mini-batch m=10 significa: 1) Dividir aleatoriamente amostras em 6000 mini-batches com 10 amostras cada. 2) Aplicar descida de gradiente estocástico usando cada mini-batch de 10 amostras, até usar todos os 6000 mini-batches. 3) Repetir 30 vezes (o número de epochs) os passos 1 e 2. No site: há boa explicação dada por Pankaj Malhotra sobre estes conceitos. Copio abaixo: "Gradient descent is an iterative algorithm which computes the gradient of a function and uses it to update the parameters of the function in order to find a maximum or minimum value of the function. In case of Neural Networks, the function to be optimized (minimized) is the loss function, and the parameters are the weights and biases in the network. Number of iterations (n): The number of times the gradient is estimated and the parameters of the neural network are updated using a batch of training instances. The batch size B is the number of training instances used in one iteration. When the total number of training instances (N) is large, a small number of training instances (B<<N) which constitute a mini-batch can be used in one iteration to estimate the gradient of the loss function and update the parameters of the neural network. It takes n (=N/B) iterations to use the entire training data once. This constitutes an epoch. So, the total number of times the parameters get updated is (N/B)*E, where E is the number of epochs. Three modes of gradient descent: 14
15 Batch mode: N=B, one epoch is same as one iteration. Mini-batch mode: 1<B<N, one epoch consists of N/B iterations. Stochastic mode: B=1, one epoch takes N iterations." AdaGrad (adaptive gradient algorithm) é um stochastic gradient descent modificado com taxa de aprendizagem η adaptativo. Também há Adam (adaptive moment estimation) [Kingma 2015]. 15
16 O programa rede7 abaixo treina rede neural de 3 camadas com número de neurônios (nlado*nlado, 30, 10) para reconhecer os dígitos do banco de dados MNIST. Usa mini-batches de tamanho m=10, P=30 epochs e taxa de aprendizagem η=3. Obtém taxa de erro 4.04% usando nlado=12 e erro 4.58% usando nlado=28. Não inverte as cores do MNIST (fundo=preto letras=branco). Usa bounding-box: MNIST mnist(nlado,false,true); //rede7.cpp //Classifica MNIST usando mini-batch m=10 e P=30 epochs //Obtem taxa de erro 4.04% usando nlado=12 #include <cekeikon.h> class RedeNeural { float logistic(float x); // Funcao logistic Mat_<float> logistic(mat_<float> x); // Calcula funcao logistic de cada elemento da matriz float Dlogistic(float x); // Derivada da funcao logistic Mat_<float> Dlogistic(Mat_<float> x); // Calcula derivada da logistic para cada elemento da matriz void trocalinhas(mat_<float>& a, int i, int j); void embaralhalinhas(mat_<float>& ax, Mat_<float>& ay, int semente); Mat_<int> nneuronio; // Numero de neuronios em cada camada vector< Mat_<float> > w; // weight vector< Mat_<float> > b; // bias public: RedeNeural(Mat_<int> _nneuronio); // construtor void train(mat_<float> ax, Mat_<float> ay); // treina Mat_<float> predict(mat_<float> qx); // faz previsao ; float RedeNeural::logistic(float x) { return 1 / ( 1 + exp(-x) ); Mat_<float> RedeNeural::logistic(Mat_<float> x) { Mat_<float> y(x.size()); for (unsigned i=0; i<x.total(); i++) y(i)=logistic(x(i)); return y; float RedeNeural::Dlogistic(float x) { float z=logistic(x); return z*(1-z); Mat_<float> RedeNeural::Dlogistic(Mat_<float> x) { Mat_<float> y(x.size()); for (unsigned i=0; i<x.total(); i++) y(i)=dlogistic(x(i)); return y; void RedeNeural::trocaLinhas(Mat_<float>& a, int i, int j) { for (unsigned c=0; c<a.cols; c++) { swap(a(i,c),a(j,c)); void RedeNeural::embaralhaLinhas(Mat_<float>& ax, Mat_<float>& ay, int semente) { if (ax.rows!=ay.rows) erro("erro: Amostras ax!= amostras ay"); RNG rng(semente); rng.next(); for (unsigned i=0; i<teto(ax.rows,2); i++) { unsigned j=rng.uniform(i+1,ax.rows); trocalinhas(ax,i,j); trocalinhas(ay,i,j); RedeNeural::RedeNeural(Mat_<int> _nneuronio) { RNG r(18); r.next(); 16
17 nneuronio=_nneuronio.clone(); w.resize(nneuronio.total()); // nao existe w[0] for (unsigned i=1; i<w.size(); i++) { w[i].create(nneuronio(i),nneuronio(i-1)); r.fill(w[i],rng::normal,0.0,1.0); b.resize(nneuronio.total()); // nao existe b[0] for (unsigned i=1; i<b.size(); i++) { b[i].create(nneuronio(i),1); r.fill(b[i],rng::normal,0.0,1.0); void RedeNeural::train(Mat_<float> ax, Mat_<float> ay) { int L=nNeuronio.total(); // Numero de camadas da rede if (ax.cols!=nneuronio(0)) erro("erro: Dimensao entrada"); if (ay.cols!=nneuronio(l-1)) erro("erro: Dimensao saida"); if (ax.rows!=ay.rows) erro("erro: Amostras ax!= amostras ay"); int N=ax.rows; // Numero de amostras int M=10; // tamanho dos mini-batches int K=N/M; // numero de mini-batches 60000/10=6000 int P=30; // numero de epochs vector< Mat_<float> > a(l); vector< Mat_<float> > z(l); vector< Mat_<float> > delta(l); vector< Mat_<float> > Dw(L); vector< Mat_<float> > Db(L); for (unsigned p=0; p<p; p++) { // para cada um dos 30 epochs printf("epoch %d\n",p); embaralhalinhas(ax,ay,p+7); for (unsigned k=0; k<k; k++) { // para cada um dos 6000 mini-batches for (unsigned m=0; m<m; m++) { // para cada uma das 10 amostras do mini-batch int s=k*m+m; //======== feed forward ================= a[0]=ax.row(s).t(); for (unsigned i=1; i<a.size(); i++) { z[i]=w[i]*a[i-1]+b[i]; a[i]=logistic(z[i]); //========== feed backward ====================== multiply( a[l-1]-ay.row(s).t(), Dlogistic(z[L-1]), delta[l-1]); for (unsigned i=l-2; i>0; i--) { multiply( Mat_<float>(w[i+1].t()*delta[i+1]), Dlogistic(z[i]), delta[i]); for (unsigned i=l-1; i>0; i--) { if (m==0) { //epoch 0, sample 0 Dw[i] = delta[i]*a[i-1].t(); Db[i] = delta[i]; else { Dw[i] += delta[i]*a[i-1].t(); Db[i] += delta[i]; // cada sample //============== update weights and biases (para cada mini-batch) ================== float eta=3.0; for (unsigned i=l-1; i>0; i--) { w[i] = w[i] - (eta/m) * Dw[i]; b[i] = b[i] - (eta/m) * Db[i]; // cada um dos 6000 mini-batches // cada um dos 10 epochs Mat_<float> RedeNeural::predict(Mat_<float> qx) { if (qx.cols!=nneuronio(0)) erro("erro: Dimensao entrada"); int L=nNeuronio.total(); // Numero de camadas da rede int N=qx.rows; // Numero de amostras Mat_<float> qp(n,nneuronio(l-1)); vector< Mat_<float> > a(l); vector< Mat_<float> > z(l); 17
18 for (unsigned s=0; s<n; s++) { a[0]=qx.row(s).t(); for (unsigned i=1; i<a.size(); i++) { z[i]=w[i]*a[i-1]+b[i]; a[i]=logistic(z[i]); qp.row(s)=a[l-1].t(); return qp; //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< int main(int argc, char** argv) { if (argc!=2) erro("ann nlado"); int nlado; convarg(nlado,argv[1]); if (nlado<2) erro("erro: nlado fora do intervalo valido"); MNIST mnist(nlado,false,true); mnist.le("c:/haebase/mnist"); // Converte ay com rotulos 0..9 para ay2 com 10 saidas Mat_<float> ay2(mnist.na,10); ay2.setto(0.0); for (unsigned i=0; i<mnist.ay.rows; i++) { int j=int(mnist.ay(i)); assert(0<=j && j<10); ay2(i,j)=1.0; Mat_<int> v = (Mat_<int>(1,3) << nlado*nlado, 30, 10); RedeNeural ind(v); ind.train(mnist.ax,ay2); Mat_<float> saida=ind.predict(mnist.qx); for (int l=0; l<mnist.nq; l++) { mnist.qp(l)=argmax(saida.row(l)); printf("erros=%10.2f\%\n",100.0*mnist.contaerros()/mnist.nq); 18
19 O programa rede-ocv abaixo treina a classe rede neural do OpenCV 2.X de 3 camadas com número de neurônios (nlado*nlado, 30, 10) para reconhecer os dígitos do banco de dados MNIST. Obtém taxa de erro 8.65% usando nlado=12. Note que a nossa implementação obtém taxa de erro bem menor (4.04%) nas mesmas condições. Podemos concluir que a implementação de rede neural do OpenCV não é muito boa. Não inverte as cores do MNIST (fundo=preto letras=branco). Usa bounding-box. MNIST mnist(nlado,false,true); //rede-ocv.cpp //Classifica MNIST usando rede neural do opencv 2.X //Obtem taxa de erro 8.65% usando nlado=12 e leva 25s #include <cekeikon.h> //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< int main(int argc, char** argv) { if (argc!=2) erro("ann nlado"); int nlado; convarg(nlado,argv[1]); if (nlado<2) erro("erro: nlado fora do intervalo valido"); MNIST mnist(nlado,false,true); mnist.le("c:/haebase/mnist"); // Converte ay com rotulos 0..9 para ay2 com 10 saidas Mat_<float> ay2(mnist.na,10); ay2.setto(0.0); for (unsigned i=0; i<mnist.ay.rows; i++) { int j=int(mnist.ay(i)); assert(0<=j && j<10); ay2(i,j)=1.0; Mat_<int> v = (Mat_<int>(1,3) << nlado*nlado, 30, 10); CvANN_MLP ind(v); ind.train(mnist.ax,ay2,mat()); Mat_<float> saida; ind.predict(mnist.qx,saida); for (int l=0; l<mnist.nq; l++) { mnist.qp(l)=argmax(saida.row(l)); printf("erros=%10.2f\%\n",100.0*mnist.contaerros()/mnist.nq); 19
20 Taxas de erros obtidos. Os dois constantes booleanos indicam inverte_cores / bounding-box. Erro true/false true/true false/true false/false rede7 nlado=12 epochs=10 rede7 nlado=10 epochs=30 rede7 nlado=12 epochs=30 rede7 nlado=16 epochs=30 rede7 nlado=20 epochs=30 rede-ocv nlado=12 rede-ocv nlado= % 5.91% 4.62% 68s 8.26% 22.86s 4.42% 26s 4.12% 4.04% 68s 4.21% 4.13% 120s 8.65% 25s 8.71% 65s 4.49% Rede7 é a minha implementação. Usa mini-batches m=10. Rede-ocv usa a implementação de rede neural do opencv 2.X. A minha implementação comete bem menos erros que a implementação do opencv e tem velocidade semelhante (usando 10 epochs). Meu programa usando 30 neurônios na camada escondida (rede7) e 30 epochs: nlado erro 6.47% 4.49% 4.17% 4.12% 4.04% 4.50% 4.21% 4.13% 4.58% tempo (treino+teste) 41s 48s 53s 61s 68s 79s 90s 119s 200s Meu programa usando 100 neurônios na camada escondida e 30 epochs: nlado erro 2.71% 12.16% tempo (treino+teste)?? 700 Observação: Aumentando o número de neurônios da camada escondida de 30 para 100 neurônios, o erro cai para nlado=12 mas aumenta para nlado=28. Provavelmente, temos um "overfitting". Resolveremos este problema com regularização. 20
21 Regularização L2 cria penalidade para pesos grandes. A função custo torna-se: C=C o + λ w 2 2n onde C o é a função custo original (função de erro), λ é o parâmtro de regularização, n é o número de amostras de treinamento e w são os pesos da redes. Intuitivamente, o efeito de regularização é fazer com que rede com pesos pequenos tenha menor custo. Backpropagation vai tentar minimizar o erro e ao mesmo tempo a soma dos pesos. Para fazer regularização, o livro faz a seguinte modificação em Python: network.py (sem regularização): self.weights = [w-(eta/len(mini_batch))*nw for w, nw in zip(self.weights, nabla_w)] network2.py (com regularização): self.weights = [(1-eta*(lmbda/n))*w-(eta/len(mini_batch))*nw for w, nw in zip(self.weights, nabla_w)] Faremos a mesma modificação em C++: rede7.cpp (sem regularização): M é tamanho de mini-batch w[i] = w[i] - (eta/m) * Dw[i]; rede8.cpp (com regularização): M é tamanho de mini-batch w[i] = (1-(eta*lmbda/N))*w[i] - (eta/m) * Dw[i]; lmbda (λ) é parâmetro de regularização. Meu programa (rede8) usando 100 neurônios na camada escondida e 30 epochs com regularização: Lmbda=5, eta=0.5. nlado erro 3.53% 2.55% tempo (treino+teste) 189s 747s Repare que o erro diminuiu substancialmente para nlado=28 (de 12% para 2,5%). A minha implementação C++ comete erro semelhante ao relatado no livro para implementação em Python. 21
22 Erros obtidos para diferentes parâmetros com regularização: nlado=28 eta=0.5 hidden neurons=100 inicialização=g(0,1) rede8 lmbda erro 2.55% 2.26% 2.34% tempo 747s 734s?? nlado=12 eta=0.5 hidden neurons=100 inicialização=g(0,1) rede8 lmbda erro 3.53% 3.13% 2.49% 2.30% tempo 189s 191s?? nlado=12 hidden neurons=100 inicialização=g(0,1) lmbda=1 rede8 eta erro 13.89% 2.35% 2.30% 2.04% 2.24% 2.41% nlado=12 eta=0.5 hidden neurons=100 inicialização de pesos=g(0,1/n) rede9 lmbda erro 3.38% 2.82% tempo Esta inicialização de pesos não diminui o erro. Com stochastic gradient descent e regularização, chegamos ao erro da ordem de 2%, usando rede neural com 3 camadas (uma camada escondida). 22
23 //rede8.cpp //Classifica MNIST usando mini-batch m=10 e P=30 epochs //Usa rede neural com 100 neuronios na camada escondida. //Usa regularizacao com lmbda=1 //Usando eta=1, chega-se a 2.04% de erro. #include <cekeikon.h> class RedeNeural { float logistic(float x); // Funcao logistic Mat_<float> logistic(mat_<float> x); // Calcula funcao logistic de cada elemento da matriz float Dlogistic(float x); // Derivada da funcao logistic Mat_<float> Dlogistic(Mat_<float> x); // Calcula derivada da funcao logistic para cada elemento da matriz void trocalinhas(mat_<float>& a, int i, int j); void embaralhalinhas(mat_<float>& ax, Mat_<float>& ay, int semente); Mat_<int> nneuronio; // Numero de neuronios em cada camada vector< Mat_<float> > w; // weight vector< Mat_<float> > b; // bias public: RedeNeural(Mat_<int> _nneuronio); // construtor void train(mat_<float> ax, Mat_<float> ay); // treina Mat_<float> predict(mat_<float> qx); // faz previsao ; float RedeNeural::logistic(float x) { return 1 / ( 1 + exp(-x) ); Mat_<float> RedeNeural::logistic(Mat_<float> x) { Mat_<float> y(x.size()); for (unsigned i=0; i<x.total(); i++) y(i)=logistic(x(i)); return y; float RedeNeural::Dlogistic(float x) { float z=logistic(x); return z*(1-z); Mat_<float> RedeNeural::Dlogistic(Mat_<float> x) { Mat_<float> y(x.size()); for (unsigned i=0; i<x.total(); i++) y(i)=dlogistic(x(i)); return y; void RedeNeural::trocaLinhas(Mat_<float>& a, int i, int j) { for (unsigned c=0; c<a.cols; c++) { swap(a(i,c),a(j,c)); void RedeNeural::embaralhaLinhas(Mat_<float>& ax, Mat_<float>& ay, int semente) { if (ax.rows!=ay.rows) erro("erro: Amostras ax!= amostras ay"); RNG rng(semente); rng.next(); for (unsigned i=0; i<teto(ax.rows,2); i++) { unsigned j=rng.uniform(i+1,ax.rows); trocalinhas(ax,i,j); trocalinhas(ay,i,j); RedeNeural::RedeNeural(Mat_<int> _nneuronio) { RNG r(18); r.next(); nneuronio=_nneuronio.clone(); w.resize(nneuronio.total()); // nao existe w[0] for (unsigned i=1; i<w.size(); i++) { w[i].create(nneuronio(i),nneuronio(i-1)); r.fill(w[i],rng::normal,0.0,1.0); b.resize(nneuronio.total()); // nao existe b[0] for (unsigned i=1; i<b.size(); i++) { b[i].create(nneuronio(i),1); 23
24 r.fill(b[i],rng::normal,0.0,1.0); void RedeNeural::train(Mat_<float> ax, Mat_<float> ay) { int L=nNeuronio.total(); // Numero de camadas da rede if (ax.cols!=nneuronio(0)) erro("erro: Dimensao entrada"); if (ay.cols!=nneuronio(l-1)) erro("erro: Dimensao saida"); if (ax.rows!=ay.rows) erro("erro: Amostras ax!= amostras ay"); int N=ax.rows; // Numero de amostras int M=10; // tamanho dos mini-batches int K=N/M; // numero de mini-batches 60000/10=6000 int P=30; // numero de epochs //int P=10; // numero de epochs vector< Mat_<float> > a(l); vector< Mat_<float> > z(l); vector< Mat_<float> > delta(l); vector< Mat_<float> > Dw(L); vector< Mat_<float> > Db(L); for (unsigned p=0; p<p; p++) { // para cada um dos 10 ou 30 epochs printf("epoch %d\n",p); embaralhalinhas(ax,ay,p+7); for (unsigned k=0; k<k; k++) { // para cada um dos 6000 mini-batches for (unsigned m=0; m<m; m++) { // para cada uma das 10 amostras do mini-batch int s=k*m+m; //======== feed forward ================= a[0]=ax.row(s).t(); for (unsigned i=1; i<a.size(); i++) { z[i]=w[i]*a[i-1]+b[i]; a[i]=logistic(z[i]); //========= calcula erro ======================== // cout << "Sample " << s << " erro: " << norm(a[l-1]-ay.row(s).t()) << endl; //========== feed backward ====================== multiply( a[l-1]-ay.row(s).t(), Dlogistic(z[L-1]), delta[l-1]); for (unsigned i=l-2; i>0; i--) { multiply( Mat_<float>(w[i+1].t()*delta[i+1]), Dlogistic(z[i]), delta[i]); for (unsigned i=l-1; i>0; i--) { if (m==0) { //epoch 0, sample 0 Dw[i] = delta[i]*a[i-1].t(); Db[i] = delta[i]; else { Dw[i] += delta[i]*a[i-1].t(); Db[i] += delta[i]; // cada sample //============== update weights and biases ================== //float eta=3.0; float eta=1.0; float lmbda=1.0; for (unsigned i=l-1; i>0; i--) { //w[i] = w[i] - (eta/m) * Dw[i]; w[i] = (1-(eta*lmbda/N))*w[i] - (eta/m)*dw[i]; b[i] = b[i] - (eta/m) * Db[i]; // cada um dos 6000 mini-batches // cada um dos 10 epochs Mat_<float> RedeNeural::predict(Mat_<float> qx) { if (qx.cols!=nneuronio(0)) erro("erro: Dimensao entrada"); int L=nNeuronio.total(); // Numero de camadas da rede int N=qx.rows; // Numero de amostras Mat_<float> qp(n,nneuronio(l-1)); vector< Mat_<float> > a(l); vector< Mat_<float> > z(l); for (unsigned s=0; s<n; s++) { a[0]=qx.row(s).t(); 24
25 for (unsigned i=1; i<a.size(); i++) { z[i]=w[i]*a[i-1]+b[i]; a[i]=logistic(z[i]); qp.row(s)=a[l-1].t(); return qp; //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< int main(int argc, char** argv) { if (argc!=2) erro("ann nlado"); int nlado; convarg(nlado,argv[1]); if (nlado<2) erro("erro: nlado fora do intervalo valido"); MNIST mnist(nlado,false,true); mnist.le("c:/haebase/mnist"); // Converte ay com rotulos 0..9 para ay2 com 10 saidas Mat_<float> ay2(mnist.na,10); ay2.setto(0.0); for (unsigned i=0; i<mnist.ay.rows; i++) { int j=int(mnist.ay(i)); assert(0<=j && j<10); ay2(i,j)=1.0; Mat_<int> v = (Mat_<int>(1,3) << nlado*nlado, 100, 10); RedeNeural ind(v); ind.train(mnist.ax,ay2); Mat_<float> saida=ind.predict(mnist.qx); for (int l=0; l<mnist.nq; l++) { mnist.qp(l)=argmax(saida.row(l)); printf("erros=%10.2f\%\n",100.0*mnist.contaerros()/mnist.nq); 25
Redes Neurais Artificiais
Redes Neurais Artificiais Fabrício Olivetti de França Universidade Federal do ABC Tópicos 1. Redes Neurais Biológicas 2. Neurônio Artificial 3. Rede Neural Artificial 4. Keras 1 Redes Neurais Biológicas
Leia maisRedes Neurais Artificiais - Introdução. Visão Computacional
Redes Neurais Artificiais - Introdução Visão Computacional Inspiração 2 Inspiração 3 Inspiração Atividade seletivanas conexões Soma os impulsos e passa a diante 4 Inspiração As conexões entre os dendritos
Leia maisAlgoritmos de Aprendizado. Formas de Aprendizado. Aprendizado Batch x Incremental. Aprendizado Batch x Incremental
Algoritmos de Aprendizado Regra de Hebb Perceptron Delta Rule (Least Mean Square Multi-Layer Perceptrons (Back Propagation Radial Basis Functions (RBFs Competitive Learning Hopfield Formas de Aprendizado
Leia maisAlgoritmos de Aprendizado. Formas de Aprendizado. Aprendizado Batch x Incremental. Aprendizado Batch x Incremental
Algoritmos de Aprendizado Regra de Hebb Perceptron Delta Rule (Least Mean Square Back Propagation Formas de Aprendizado Existe dois métodos básicos de aplicação do algoritmo Back Propagation: Aprendizado
Leia maisImagem f
Imagem integral (ou integral da imagem) Imagem f. 8 3 9 7 1 8 5 2 8 7 3 6 5 2 9 3 s: Integral da imagem f (imagem integral) 8 11 20 27 9 20 34 43 17 35 52 67 22 42 68 86 s(u,v) = f(u,v)+s(u-1,v)+s(u,v-1)-s(u-1,v-1)
Leia maisRedes Neurais Artificiais
Redes Neurais Artificiais Marcelo K. Albertini 24 de Julho de 2014 2/34 Conteúdo Perceptron Gradiente descendente Redes multicamadas Retropropagação de erros 3/34 Modelos conexionistas Humanos Tempo de
Leia maisRegra de Hebb Perceptron Delta Rule (Least Mean Square) Multi-Layer Perceptrons (Back Propagation) Hopfield Competitive Learning Radial Basis Function
Algoritmos de Aprendizado Regra de Hebb Perceptron Delta Rule (Least Mean Square) Multi-Layer Perceptrons (Back Propagation) Hopfield Competitive Learning Radial Basis Function Formas de Aprendizado Existe
Leia maisJAI 6 - Deep Learning Teoria e Prática
JAI 6 - Deep Learning Teoria e Prática Esteban Clua e Cristina Nader Vasconcelos Universidade Federal Fluminense Fundamentos Computação baseada em modelos crisnv@ic.uff.br 2 Computação baseada em aprendizado
Leia maisIntrodução às Redes Neurais Artificiais
Introdução às Redes Neurais Artificiais Perceptrons de Múltiplas Camadas I Prof. João Marcos Meirelles da Silva www.professores.uff.br/jmarcos Departamento de Engenharia de Telecomunicações Escola de Engenharia
Leia maisINF 1771 Inteligência Artificial
INF 1771 Inteligência Artificial Aula 22 Redes Neurais Edirlei Soares de Lima Formas de Aprendizado Aprendizado Supervisionado Árvores de decisão. K-Nearest Neighbor (KNN). Support
Leia maisRedes Neurais Artificial. Prática. Inteligência Artificial
Redes Neurais Artificial Prática Inteligência Artificial Professor: Rosalvo Ferreira de Oliveira Neto Estrutura 1. Introdução a MLP 2. Base de dados e Pré-Processamento 3. Prática MLP - Introdução Redes
Leia maisReconhecimento de Padrões/Objetos
Reconhecimento de Padrões/Objetos André Tavares da Silva andre.silva@udesc.br Capítulo 2 de Gonzales Classificação Linear Introdução Para utilizar uma função discriminante linear (Linear Discriminant Function)
Leia maisMulti-Layer. Perceptrons. Algoritmos de Aprendizado. Perceptrons. Perceptrons
Algoritmos de Aprendizado Regra de Hebb Perceptron Delta Rule (Least Mean Square) Multi-Layer Perceptrons (Back Propagation) Radial Basis Functions (RBFs) Competitive Learning Hopfield Multi-Layer Perceptrons
Leia maisRedes Neurais Artificiais
Redes Neurais Artificiais Multi-layer Perceptrons e Backpropagation Marcílio Souto DIMAp/UFRN Redes de várias camadas MLP - Multi-Layer Perceptron (Adaline?!) Backpropagation network Superar as limitações
Leia maisNota 1: Baixei Tiny-DNN em 28/7/2017 a última versão. https://github.com/tiny-dnn/tiny-dnn
Rede neural convolutional (convolutional deep learning) Nesta apostila, vamos estudar rede neural convolucional, usando o material disponível no livro (disponibilizado gratuitamente pelo autor): http://neuralnetworksanddeeplearning.com/
Leia maisRedes neurais artificiais
Redes neurais artificiais Conceitos em redes neuronais Redes neuronais artificiais (RNA): uma metáfora cerebral para processamento de informações Computação neuronal Muitos usos de RNA para Reconhecimento
Leia maisNúmero: Nome:
Número: Nome: 1 -------------------------------------------------------------------------------------------------------------- INSTITUTO SUPERIOR TÉCNICO Sistemas de Apoio à Decisão Exame 1 20 junho 2006
Leia maisExplicação simplificada de template matching (casamento de máscara, ou casamento de modelo)
Explicação simplificada de template matching (casamento de máscara, ou casamento de modelo) T R(x,y) I Template matching percorre a imagem I comparando template T com cada posição (x,y) de I. O resultado
Leia maisMulti-Layer. Perceptrons. Algoritmos de Aprendizado. Perceptrons. Perceptrons
Algoritmos de Aprendizado Regra de Hebb Perceptron Delta Rule (Least Mean Square) Back Propagation Multi-Layer Perceptrons Redes de apenas uma camada só representam funções linearmente separáveis Redes
Leia maisPCA: Principal Component Analysis
PCA: Principal Component Analysis PCA é muito usado para diminuir a dimensionalidade das características (features). Na internet há muitos textos bons sobre PCA: [1] Um exemplo numérico muito bom está
Leia maisRedes Neurais e Sistemas Fuzzy
Redes Neurais e Sistemas Fuzzy O ADALINE e o algoritmo LMS O ADALINE No contexto de classificação, o ADALINE [B. Widrow 1960] pode ser visto como um perceptron com algoritmo de treinamento baseado em minimização
Leia maisAmbiente MATLAB. Redes Neurais. Tela Principal do MATLAB MATLAB 6.5. MATLAB MATrix LABoratory. Programação baseada em Matrizes
Redes Neurais MATLAB 6.5 Ambiente MATLAB MATLAB MATrix LABoratory Programação baseada em Matrizes Vetores e escalares também podem ser considerados matrizes, xn, Nx, x Tela Principal do MATLAB Tela Principal
Leia maisRegressão. Prof. Fabrício Olivetti de França Universidade Federal do ABC
Regressão Prof. Fabrício Olivetti de França Universidade Federal do ABC Aprendendo com Exemplos Uma das formas de aprendizado de máquina é definido como: Dado um conjunto de exemplos X, com cada x sendo
Leia maisRegra de Hebb Perceptron Delta Rule (Least Mean Square) Multi-Layer Perceptrons (Back Propagation) Hopfield Competitive Learning Radial Basis Function
Algoritmos de Aprendizado Regra de Hebb Perceptron Delta Rule (Least Mean Square) Multi-Layer Perceptrons (Back Propagation) Hopfield Competitive Learning Radial Basis Function Multi-Layer Perceptrons
Leia maisGT-JeDi - Curso de Desenv. de Jogos IA para Jogos
GT-JeDi - Curso de Desenv. de Jogos IA para Jogos Gustavo Pessin 2006/2 - A07 Cronograma Conceitos Neurônio artificial Redes: Perceptron e Multi Layer Perceptron (MLP), Exemplos Separando cores Prevendo
Leia maisINF1005: Programação 1. Vetores. 02/05/10 (c) Paula Rodrigues 1
INF1005: Programação 1 Vetores 02/05/10 (c) Paula Rodrigues 1 Tópicos Principais Declaração e inicialização de vetores Exemplos de manipulação de vetores Vetores passados para funções Exemplos de funções
Leia maisAprendizado de Máquinas. Multi-Layer Perceptron (MLP)
Universidade Federal do Paraná (UFPR) Departamento de Informática (DInf) Aprendizado de Máquinas Multi-Layer Perceptron (MLP) David Menotti, Ph.D. web.inf.ufpr.br/menotti Redes Neuronais Cérebro humano.
Leia maisMini-projeto: Reconhecimento de Digitos com MLPs. Germano C. Vasconcelos Centro de Informática - UFPE
Mini-projeto: Reconhecimento de Digitos com MLPs Germano C. Vasconcelos Centro de Informática - UFPE 1 Link do Material http://neuralnetworksanddeeplearning.com/chap1.html 2 Objetivo: Treinar uma Rede
Leia maisRedes Neurais. Prof. Aurora Pozo. Obs: slides baseados em Prof. Marcílio Souto e Prof. Marley Vellasco
Redes Neurais Prof. Aurora Pozo Obs: slides baseados em Prof. Marcílio Souto e Prof. Marley Vellasco CONTEÚDO Introdução Motivação, Objetivo, Definição, Características Básicas e Histórico Conceitos Básicos
Leia maisIntrodução às Redes Neurais Artificiais
Introdução às Redes Neurais Artificiais Perceptrons de Múltiplas Camadas II Prof. João Marcos Meirelles da Silva www.professores.uff.br/jmarcos Departamento de Engenharia de Telecomunicações Escola de
Leia mais( ) Aula de Hoje. Introdução a Sistemas Inteligentes. Modelo RBF (revisão) Modelo RBF (revisão)
Introdução a Sistemas Inteligentes ópicos em Redes Neurais III: Redes Neurais RBF ª Parte Prof. Ricardo J. G. B. Campello ICMC / USP Aula de Hoje Revisão de Modelos RBF reinamento de Modelos RBF Estimação
Leia maisAlgoritmos de Regressão
Algoritmos de Regressão com Big Data Fabrício Olivetti de França Universidade Federal do ABC Tópicos 1. Regressão Linear 2. Ordinary Least Square 3. Gradiente Descendente 4. Overfitting 5. Variáveis Não-Lineares
Leia maisO Algoritmo de Treinamento: Máquina de Aprendizado Extremo (Extreme Learning Machine - ELM)
O Algoritmo de Treinamento: Máquina de Aprendizado Extremo (Extreme Learning Machine - ELM) Thiago Henrique Cupertino SCE5809 - Redes Neurais 23 de Novembro de 2010 Conteúdo Introdução Desvantagens do
Leia maisClassificadores Lineares
Universidade Federal do Paraná (UFPR) Bacharelado em Informática Biomédica Classificadores Lineares David Menotti www.inf.ufpr.br/menotti/ci171-182 Hoje Funções Discriminantes Lineares Perceptron Support
Leia maisIntrodução à linguagem C++
Estrutura de Dados e Algoritmos e Programação e Computadores II Aula 2: Introdução à linguagem C++ Introdução à linguagem C++ Conceitos básicos: variáveis, tipos de dados, constantes, I/O, etc. Estruturas
Leia mais3 Redes Neurais Artificiais
3 Redes Neurais Artificiais 3.1. Introdução A capacidade de implementar computacionalmente versões simplificadas de neurônios biológicos deu origem a uma subespecialidade da inteligência artificial, conhecida
Leia maisSistemas Operacionais e Introdução à Programação. Programação com linguagem C
Sistemas Operacionais e Introdução à Programação Programação com linguagem C 1 Entrada e saída: escrevendo na tela Veja uma comparação entre um programa Portugol e seu equivalente em C: Inicio Inteiro
Leia maisINSTITUTO SUPERIOR TÉCNICO Sistemas de Apoio à Decisão
Número: Nome: -------------------------------------------------------------------------------------------------------------- INSTITUTO SUPERIOR TÉCNICO Sistemas de Apoio à Decisão Exame: 6 January 207
Leia maisRedes Neurais MLP: Exemplos e Características
Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação Redes Neurais MLP: Exemplos e Características DCA0121 Inteligência Artificial Aplicada Heitor Medeiros 1
Leia maisSistema de Inferência Fuzzy baseado em Redes Adaptativas (ANFIS) Sistema de Inferência Fuzzy
Redes Neurais Sistema de Inferência Fuzzy baseado em Redes Adaptativas (ANFIS) Sistema de Inferência Fuzzy Um Sistema de Inferência Fuzzy (SIF) é um tipo especial de Sistema Baseado em Conhecimento (SBC).
Leia maisConsiderações de Desempenho
Back Propagation Considerações de Desempenho Dicas para o BP O uso da função de ativação simétrica geralmente acelera o treinamento TANH +1 logistic linear 0 tanh -1-4 +4 1 Dicas para o BP Os pesos devem
Leia maisESTRUTURA COM DECISÃO COMPOSTA
LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA ESTRUTURA COM DECISÃO COMPOSTA Prof. Dr. Daniel Caetano 2018-1 Objetivos Entender o que são decisões compostas Compreender como implementar decisões compostas Capacitar
Leia maisAplicação de Redes Neuronais Artificiais no Comportamento da Precipitação em Portugal Continental.
2º ENCONTRO DE PÓS-GRADUAÇÃO EM INVESTIGAÇÃO E ENSINO DAS CIÊNCIAS FÍSICAS E DA TERRA DA UNIVERSIDADE DE ÉVORA Aplicação de Redes Neuronais Artificiais no Comportamento da Precipitação em Portugal Continental.
Leia maisPCS Laboratório de Programação Orientada a Objetos 1a. Prova. 02 de Setembro de 2015
PCS - 3111 Laboratório de Programação Orientada a Objetos 1a. Prova 02 de Setembro de 2015 Questão 1 (2,6) Deseja-se implementar um programa que recebe um mês e um dia atual de um ano e o mês e o dia de
Leia maisRedes Neurais Artificiais. Sistemas de Informação/Ciências da Computação UNISUL Aran Bey Tcholakian Morales, Dr. Eng. (Apostila 9)
Redes Neurais Artificiais Sistemas de Informação/Ciências da Computação UNISUL Aran Bey Tcholakian Morales, Dr. Eng. (Apostila 9) Conceitos 2 Redes Neurais As Redes Neurais Artificias são modelos computacionais
Leia maisAula 8 Comandos de Seleção
Aula 8 Comandos de Seleção Algoritmos e Programação de Computadores Profs: Ronaldo Castro de Oliveira ronaldo.co@ufu.br Anilton Joaquim da Silva anilton@ufu.br 1 Introdução Até agora não aprendemos a dizer
Leia maisBack Propagation. Dicas para o BP
Back Propagation Considerações de Desempenho Dicas para o BP O uso da função de ativação simétrica geralmente acelera o treinamento TANH +1 logistic linear 0 tanh -1-4 +4 11 Dicas para o BP Os pesos devem
Leia maisRede RBF (Radial Basis Function)
Rede RBF (Radial Basis Function) André Tavares da Silva andre.silva@udesc.br Roteiro Introdução à rede neural artificial RBF Teorema de Cover da separabilidade de padrões RBF x MLP RBF Função de ativação
Leia maisUNIVERSIDADE DO ESTADO DE MATO GROSSO - UNEMAT. Faculdade de Ciências Exatas e Tecnológicas FACET / Sinop Curso de Bacharelado em Engenharia Elétrica
REDES NEURAIS ARTIFICIAIS PERCEPTRON MULTICAMADAS Prof. Dr. André A. P. Biscaro 1º Semestre de 2018 Arquitetura Redes Perceptron de Múltiplas Camadas (PMC), também conhecidas como redes MLP (Multiple Layer
Leia maisAplicações de Álgebra Linear. Lista de Exercícios Humberto José Bortolossi Ainda sobre Matrizes e Aplicações
GMA DEPARTAMENTO DE MATEMÁTICA APLICADA Aplicações de Álgebra Linear Lista de Exercícios Humberto José ortolossi http://wwwprofessoresuffbr/hjbortol/ 04 Ainda sobre Matrizes e Aplicações [0] Efetue a multiplicação
Leia maisInteligência Artificial Redes Neurais
Inteligência Artificial Jarley P. Nóbrega, Dr. Faculdade Nova Roma Bacharelado em Ciência da Computação jpn@jarley.com Semestre 2018.2 Jarley P. Nóbrega, Dr. (Nova Roma) Inteligência Artificial Semestre
Leia maisTÓPICOS EM INTELIGÊNCIA ARTIFICIAL Redes Neurais Artificiais
TÓPICOS EM INTELIGÊNCIA ARTIFICIAL Redes Neurais Artificiais ricardo.kerschbaumer@ifc.edu.br http://professor.luzerna.ifc.edu.br/ricardo-kerschbaumer/ Introdução O Cérebro humano Mais fascinante processador
Leia mais3 Modelos Comparativos: Teoria e Metodologia
3 Modelos Comparativos: Teoria e Metodologia Para avaliar o desempenho do modelo STAR-Tree, foram estimados os modelos Naive, ARMAX e Redes Neurais. O ajuste dos modelos ARMAX e das redes neurais foi feito
Leia mais3 REDES CLÁSSICAS PERCEPTRON E ADALINE
w b Professor José Gomes de Carvalho Jr. 3 REDES CLÁSSICAS PERCEPTRON E ADALINE 3.-Redes com funções de ativação de limiar Uma rede simples de uma camada, consiste em um ou mais neurônios de saída j conectados
Leia maisProgramação de Computadores II Aula 03. Linguagem C I
Programação de Computadores II Slides cedidos por Karina Mochetti 2018.1 C vs Python Python é uma linguagem muito mais nova, de 1991. C é muito mais eciente, os programas rodam mais rápido. Seu objetivo
Leia maisscikit-learn: Aprendizado de máquina 101 com Python
scikit-learn: Aprendizado de máquina 101 com Python Luciana Fujii Campus Party BH 2016 1 / 30 Introdução Aprendizado de máquina Aprendizado de máquina é o campo da ciência da computação que dá aos computadores
Leia maisCálculo Numérico / Métodos Numéricos. Solução de equações polinomiais Briot-Ruffini-Horner
Cálculo Numérico / Métodos Numéricos Solução de equações polinomiais Briot-Ruffini-Horner Equações Polinomiais p = x + + a ( x) ao + a1 n x n Com a i R, i = 0,1,, n e a n 0 para garantir que o polinômio
Leia maisBAC004 Informática Teórica T2 Professora: Fabiana Costa Guedes Lista 05 Vetores e Matrizes Vetores
BAC004 Informática Teórica T2 Professora: Fabiana Costa Guedes Lista 05 Vetores e Matrizes Vetores 1- Faça um programa que preencha um vetor com seis elementos numéricos inteiros, calcule e mostre: a.
Leia maisProgramação Estruturada
Programação Estruturada Ponteiros Parte 1 Professores Emílio Francesquini e Carla Negri Lintzmayer 2018.Q3 Centro de Matemática, Computação e Cognição Universidade Federal do ABC Ponteiros Ponteiro Ponteiros
Leia maisLÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA ESTRUTURA COM DECISÃO MÚLTIPLA. Prof. Dr. Daniel Caetano
LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA ESTRUTURA COM DECISÃO MÚLTIPLA Prof. Dr. Daniel Caetano 2013-1 Objetivos Entender o que são decisões múltiplas Compreender como implementar decisões múltiplas Capacitar
Leia maisESTRUTURAS CONDICIONAIS. Introdução à Ciência da ComputaçãoI Simone Senger de Souza
ESTRUTURAS CONDICIONAIS Introdução à Ciência da ComputaçãoI Simone Senger de Souza Estruturas de Controle ESTRUTURA SEQUENCIAL ESTRUTURA CONDICIONAL ESTRUTURA DE REPETIÇÃO 2 Estruturas Condicionais Estrutura
Leia maisFundamentos de Programação
Fundamentos de Programação Linguagem C++: arrays - aula I Bruno Emerson Gurgel Gomes 1 1 Instituto Federal de Educação, Ciência e Tecnologia do RN (IFRN) 2012 Bruno Gomes (IFRN) Fundamentos de Programação
Leia mais7 a Lista de Exercícios Assunto: Funções e passagem por referência com vetor e matriz (Tópico 7)
7 a Lista de Exercícios Assunto: Funções e passagem por referência com vetor e matriz (Tópico 7) Essa lista de exercícios tem como objetivo principal desenvolver algoritmos a partir dos conteúdos abordados
Leia maisRedes Neurais e Sistemas Fuzzy
Redes Neurais e Sistemas Fuzzy Redes de uma única camada O Perceptron elementar Classificação de padrões por um perceptron A tarefa de classificação consiste em aprender a atribuir rótulos a dados que
Leia maisTeorema de Aprox. Universal. Teorema de Aprox. Universal. Teorema de Aprox. Universal. Teorema de Aprox. Universal. Teorema de Aprox.
SCE-5809 - REDES NEURAIS Redes Neurais Multi-Camadas Parte 3 Profa Roseli Ap Francelin Romero Qual é o número mínimo de camadas num PMC que fornece uma aproximação para qualquer mapeamento contínuo? Cybenko,
Leia maisAvaliando Hipóteses. George Darmiton da Cunha Cavalcanti Tsang Ing Ren CIn/UFPE
Avaliando Hipóteses George Darmiton da Cunha Cavalcanti Tsang Ing Ren CIn/UFPE Pontos importantes Erro da Amostra e Erro Real Como Calcular Intervalo de Confiança Erros de hipóteses Estimadores Comparando
Leia maisAprendizagem de Máquina
Aprendizagem de Máquina Alessandro L. Koerich Programa de Pós-Graduação em Informática Pontifícia Universidade Católica do Paraná (PUCPR) Redes Neurais Artificiais Plano de Aula Introdução Motivação Biológica
Leia maisDivisão e Conquista. Norton T. Roman. Apostila baseada nos trabalhos de Cid de Souza, Cândida da Silva e Delano M. Beder
Divisão e Conquista Norton T. Roman Apostila baseada nos trabalhos de Cid de Souza, Cândida da Silva e Delano M. Beder Divisão e Conquista Construção incremental Ex: Consiste em, inicialmente, resolver
Leia maisAlgoritmos e Estruturas de Dados I (DCC/003) Funções
Algoritmos e Estruturas de Dados I (DCC/003) Funções Funções Funções definem operações que são usadas frequentemente Funções, na matemática, requerem parâmetros de entrada, e definem um valor de saída
Leia maisRedes Neuronais. Apontamentos Aulas TP de Inteligência Artificial LEI/ISEP Introdução às Redes Neuronais. Friday, April 5, 13
Redes Neuronais 1 Modelo do Perceptrão Cada neurónio é composto por dois elementos: o primeiro adiciona os produtos entre os sinais de entrada e respectivos pesos este produto, representado por a representa
Leia maisUnidade 08 MATLAB Neural Network Toolkit
Unidade 08 MATLAB Neural Network Toolkit 1. Introdução Uma rede neural artificial (NN daqui em diante) é um modelo matemático que consiste de neurônios interconectados que imitam, em uma escala menor,
Leia maisRedes Neurais: MLP. Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação
Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação Redes Neurais: MLP DCA0121 Inteligência Artificial Aplicada Heitor Medeiros 1 Tópicos Redes diretas de múltiplas
Leia maisRedes Neurais Artificial
Redes Neurais Artificial Tópicos: Introdução ao estudo de RNA sua origem e inspiração biológica Características gerais das RN e descrição do neurônio artificial Aprendizado de RN e tipos de Aprendizado
Leia maisImplementaça o de Rede Neural Artificial
Implementaça o de Rede Neural Artificial Professora Dra Sarajane M. Peres Inteligência artificial - 2012 Integrantes Renato Alexey Gabriel do Valle Bandeira André Kawamura Oliveira Renato Sipriano Marcos
Leia maisResolução de problemas com apenas restrições lineares de igualdade
Resolução de problemas com apenas restrições lineares de igualdade Marina Andretta ICMC-USP 14 de outubro de 2014 Marina Andretta (ICMC-USP) sme0212 - Otimização não-linear 14 de outubro de 2014 1 / 22
Leia maisMultiple Layer Perceptron
Universidade Federal do Paraná (UFPR) Bacharelado em Informática Biomédica Multiple Layer Perceptron David Menotti www.inf.ufpr.br/menotti/ci171-182 Hoje Multiple Layer Perceptron (MLP) Backpropagation
Leia maisPROGRAMAÇÃO em C. Vitor Valerio de Souza Campos
PROGRAMAÇÃO em C Vitor Valerio de Souza Campos Algoritmos x Programação Algoritmo é um conjunto finito de regras, bem definidas, para a solução de um problema em um tempo finito (Orth, 2001). Programa
Leia mais# Estrutura de Dados # Aula - Revisão de C/C++ na Prática. Prof. Leinylson Fontinele Pereira
# Estrutura de Dados # Aula - Revisão de C/C++ na Prática Prof. Leinylson Fontinele Pereira Na aula anterior... Ponteiros Funções Introdução 3 O que vamos aprender? Preparação do ambiente de testes Conceitos
Leia maisRedes Neurais Artificiais (RNA)
Redes Neurais Artificiais (RNA) Definições: 1. Técnica inspirada no funcionamento do cérebro, onde neurônios artificiais, conectados em rede, são capazes de aprender e de generalizar. 2. Técnica de aproximação
Leia maisRef: H.Gould e J. Tobochnik. Para integrais em uma dimensão as regras do trapezóide e de Simpson são
Método de Monte Carlo Resolução de Integrais Ref: H.Gould e J. Tobochnik Para integrais em uma dimensão as regras do trapezóide e de Simpson são melhores, mais rápidas. A técnica de resolução de integrais
Leia maisProgramação Estruturada
Programação Estruturada Recursão Professores Emílio Francesquini e Carla Negri Lintzmayer 2018.Q3 Centro de Matemática, Computação e Cognição Universidade Federal do ABC Recursão Recursão 1 Recursão 2
Leia maisTópicos Especiais: Inteligência Artificial REDES NEURAIS
Tópicos Especiais: Inteligência Artificial REDES NEURAIS Material baseado e adaptado do Cap. 20 do Livro Inteligência Artificial de Russell & Norvig Bibliografia Inteligência Artificial Russell & Norvig
Leia maisFUNÇÕES EM C Material adaptado da profa Silvana Maria Affonso de Lara
Universidade do Estado de Minas Gerais - UEMG Curso de Engenharia da Computação FUNÇÕES EM C 1 Material adaptado da profa Silvana Maria Affonso de Lara ROTEIRO DA AULA Definição de Função Argumentos, retornos
Leia maisSSC304 Introdução à Programação Para Engenharias. Ponteiros. GE4 Bio
Universidade de São Paulo Instituto de Ciências Matemáticas e de Computação Departamento de Sistemas de Computação Introdução à Para Engenharias s GE4 Bio GE4Bio Grupo de Estudos em Sinais Biológicos Prof.Dr.
Leia maisSobrecarga. Algoritmos e Programação II. Aula 3 Sobrecarga
Algoritmos e Programação II Aula 3 Sobrecarga *Adaptado do material do Prof. Júlio Machado Sobrecarga Em várias linguagens é comum encontrarmos rotinas que fazem basicamente a mesma coisa, porém, com nomes
Leia maisCCM0118 Computação I
CCM0118 Computação I Departamento de Ciência da Computação IME-USP Curso de Ciências Moleculares Turma 22 Segundo Semestre de 2012 Segundo Exercício-Programa Prazo de entrega: até 16 de outubro de 2012.
Leia maisRedes Neurais. A Rede RBF. Redes RBF: Função de Base Radial. Prof. Paulo Martins Engel. Regressão não paramétrica. Redes RBF: Radial-Basis Functions
Redes RBF: Função de Base Radial Redes Neurais A Rede RBF O LP é baseado em unidades que calculam uma função não-linear do produto escalar do vetor de entrada e um vetor de peso. A rede RBF pertence a
Leia maisRECONHECIMENTO DE GÊNERO ATRAVÉS DA VOZ
RECONHECIMENTO DE GÊNERO ATRAVÉS DA VOZ Marcela Ribeiro Carvalho marcela@enecar.com.br IFG/Câmpus Goiânia Hipólito Barbosa Machado Filho hipolito.barbosa@ifg.edu.br IFG/Câmpus Goiânia Programa Institucional
Leia maisRevisão C++ - Parte 1
Revisão C++ - Parte 1 Prof. Gustavo Leitão Campus Natal Central Disciplina Programação para Ambiente de Redes 5/3/2010 Objetivo da Aula 5/3/2010 5/3/2010 OBJETIVO DA AULA Revisar os principais comandos
Leia maisLinguagem de Programação II Implementação
Linguagem de Programação II Implementação Prof. Alessandro Borges 2 Tópicos Criando objeto Definindo valores para os atributos do objeto Método construtor Definindo valores padrão para os atributos dos
Leia maisAula 28: Arquivos de texto
Aula 28: Arquivos de texto Introdução a Programação Túlio Toffolo & Puca Huachi http://www.toffolo.com.br BCC201 2018/2 Baseado nos slides de Guillermo Cámara-Chávez Aulas anteriores Memória Ponteiro Utilização
Leia maisESTRUTURAS CONDICIONAIS. Baseado nos slides de autoria de Rosely Sanches e Simone Senger de Souza
ESTRUTURAS CONDICIONAIS Baseado nos slides de autoria de Rosely Sanches e Simone Senger de Souza Estruturas de Controle ESTRUTURA SEQUENCIAL ESTRUTURA CONDICIONAL ESTRUTURA DE REPETIÇÃO 2 Estruturas Condicionais
Leia maisOrientação a Objetos - Programação em C++
OO Engenharia Eletrônica Orientação a Objetos - Programação em C++ Slides 14: As classes List e Vector da STL (Standard Template Library). Prof. Jean Marcelo SIMÃO Classe List Uma classe Predefinida na
Leia maisEXERCICIOS RESOLVIDOS - INT-POLIN - MMQ - INT-NUMERICA - EDO
Cálculo Numérico EXERCICIOS EXTRAIDOS DE PROVAS ANTERIORES o sem/08 EXERCICIOS RESOLVIDOS - INT-POLIN - MMQ - INT-NUMERICA - EDO x. Considere a seguinte tabela de valores de uma função f: i 0 f(x i ).50
Leia maisProgramação: Vetores
Programação de Computadores I Aula 09 Programação: Vetores José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011-1 1/62 Motivação Problema Faça um programa que leia
Leia maisFundamentos de Inteligência Artificial [5COP099]
Fundamentos de Inteligência Artificial [5COP099] Dr. Sylvio Barbon Junior Departamento de Computação - UEL Disciplina Anual Assunto Aula 16 Redes Neurais Artificiais (MLP) 2 de 24 (MLP) Sumário Introdução
Leia maisUNIVERSIDADE DO ESTADO DE MATO GROSSO - UNEMAT. Faculdade de Ciências Exatas e Tecnológicas FACET / Sinop Curso de Bacharelado em Engenharia Elétrica
Toolbox de Redes Neurais MATLAB Prof. Dr. André A. P. Biscaro 1º Semestre de 2017 Toolbox de Redes Neurais Introdução ao Matlab Linha de comando NNTool Estudo de Casos Análise de Crédito Bancário (Classificação).
Leia mais