@SuppressWarnings("unused")
  public void treinamento(
      Double[][] amostras, Double[][] esperado, double taxaDeAprendizado, double precisao) {
    double erroAnterior, erroTemp;

    if (!pesosSetados) {
      inicializarPesos(amostras[0].length);
    }

    this.erroMedio = 0.0;
    this.quantEpocas = 0;

    strResult.append("\n--------------------- Treinamento -------------------\n");
    strResult.append("Pesos Iniciais \n");
    for (int i = 0; i < camadasIntermediarias.size(); i++) {
      strResult.append("Camada " + i + "\n");
      pesosCamada(camadasIntermediarias.get(i));
    }
    strResult.append("Camada de Saida\n");
    pesosCamada(camadaDeSaida);

    do {
      erroTemp = 0.0;
      erroAnterior = this.erroMedio;

      /* Irá percorrer todas as amostras e calcular o erro médio */
      for (int i = 0; i < amostras.length; i++) {
        camadasIntermediarias.get(0).combinarEntradas(amostras[i]);
        camadasIntermediarias.get(0).gerarSaidas();
        for (int j = 1; j < camadasIntermediarias.size(); j++) {
          camadasIntermediarias
              .get(j)
              .combinarEntradas(camadasIntermediarias.get(j - 1).getVetorSaida());
          camadasIntermediarias.get(j).gerarSaidas();
        }
        camadaDeSaida.combinarEntradas(
            camadasIntermediarias.get(camadasIntermediarias.size() - 1).getVetorSaida());
        camadaDeSaida.gerarSaidas();
        camadaDeSaida.calcularGradiente(esperado[i]);

        camadaDeSaida.ajustarPesos(
            taxaDeAprendizado,
            camadasIntermediarias.get(camadasIntermediarias.size() - 1).getVetorSaida());
        ajustarCamadasIntermediarias(amostras, taxaDeAprendizado, i);
        erroTemp += Math.abs(calcularErro(esperado[i]));
      }
      erroMedio = erroTemp / amostras.length;
      quantEpocas++;
    } while (this.erroMedio > precisao);
    strResult.append("\nTreinado por " + quantEpocas + " épocas.\n");
    strResult.append("\nPesos Finais \n");
    for (int i = 0; i < camadasIntermediarias.size(); i++) {
      strResult.append("Camada " + i + "\n");
      pesosCamada(camadasIntermediarias.get(i));
    }
    strResult.append("Camada de Saida\n");
    pesosCamada(camadaDeSaida);

    imprimirCamadaDeSaida();
  }
  public double calcularErro(Double[] esperado) {
    double soma = 0.0;

    for (int i = 0; i < camadaDeSaida.getVetorSaida().length; i++) {
      soma += esperado[i] - camadaDeSaida.getVetorSaida()[i];
    }

    return soma;
  }
 private void imprimirCamadaDeSaida() {
   for (int i = 0; i < camadaDeSaida.getQuantNeuronios(); i++) {
     for (int j = 0; j < camadaDeSaida.getNeuronios().get(i).getPesos().length; j++) {
       System.out.print(camadaDeSaida.getNeuronios().get(i).getPesos()[j] + " ");
     }
     System.out.println("\n");
   }
   System.out.println("Treinado por " + quantEpocas + " epocas");
 }
  public void inicializarPesos(int tam) {
    if (camadasIntermediarias.size() > 0) {
      camadasIntermediarias.get(0).gerarPesos(tam);

      for (int i = 1; i < camadasIntermediarias.size(); i++) {
        camadasIntermediarias
            .get(i)
            .gerarPesos(camadasIntermediarias.get(i - 1).getQuantNeuronios());
      }
      camadaDeSaida.gerarPesos(
          camadasIntermediarias.get(camadasIntermediarias.size() - 1).getQuantNeuronios());
    } else {
      camadaDeSaida.gerarPesos(tam);
    }
  }
  public void executar(Double[] amostras) {
    if (camadasIntermediarias.size() > 0) {
      camadasIntermediarias.get(0).combinarEntradas(amostras);
      camadasIntermediarias.get(0).gerarSaidas();

      for (int i = 1; i < camadasIntermediarias.size(); i++) {
        camadasIntermediarias
            .get(i)
            .combinarEntradas(camadasIntermediarias.get(i - 1).getVetorSaida());
        camadasIntermediarias.get(i).gerarSaidas();
      }

      camadaDeSaida.combinarEntradas(
          camadasIntermediarias.get(camadasIntermediarias.size() - 1).getVetorSaida());
      camadaDeSaida.gerarSaidas();
      strResult.append("\nSaida " + Arrays.toString(camadaDeSaida.getVetorSaida()));
    } else {
      camadaDeSaida.combinarEntradas(amostras);
      camadaDeSaida.gerarSaidas();
    }
    imprimeVetor(camadaDeSaida.getVetorSaida());
  }
 public void setarPesos(Double[] pesos1, Double[] pesos2, Double[] pesos3) {
   inicializarPesos(2);
   camadasIntermediarias.get(0).getNeuronios().get(0).setPesos(pesos1);
   camadasIntermediarias.get(0).getNeuronios().get(1).setPesos(pesos2);
   camadaDeSaida.getNeuronios().get(0).setPesos(pesos3);
 }