/** * O algoritmo de retropropagação matricial (Ver a interface Mat) * * @param entradas as entradas da rede * @param e o erro obtido durante o feedForward da rede com 'entradas' */ private void backward(double[] entradas, double[] e) { double[][] m = new double[1][0]; double[][] deltaW; double[] deltaB; m[0] = e; for (int i = camada.length - 1; i > 0; i--) { m = Mat.produto(Mat.diag(Mat.dfSigmoide(camada[i].getSaida())), m); deltaB = m[0]; deltaW = Mat.transp(Mat.kProduto(Mat.transp(camada[i - 1].getSaida()), m)); m = Mat.produto(camada[i].w, m); atualizaCamada(i, deltaW, deltaB); } m = Mat.produto(Mat.diag(Mat.dfSigmoide(camada[0].getSaida())), m); deltaB = m[0]; deltaW = Mat.transp(Mat.kProduto(Mat.transp(entradas), m)); atualizaCamada(0, deltaW, deltaB); }