*/
// PRIMEIRA CAMADA
kernelProdEscalar.setArgs(clBufferEntrada, clBufferPesos1, clBufferPesosBias1,
clBufferSaida1, qtdNeuronios_1, qtdNeuronios_1);
//aqui diz quantos work itens trabalharao para executar o kernel
CLEvent prodEvt = kernelProdEscalar.enqueueNDRange(queue, new int[]{qtdNeuronios_1});
//faz a leitura do 'result'
//DoubleBuffer dBufferResSaida1 = clBufferSaida1.read(queue,prodEvt);
// SEGUNDA CAMADA
clBufferSaida1 = context.createDoubleBuffer(CLMem.Usage.Input,
(DoubleBuffer) clBufferSaida1.read(queue, prodEvt), true);
//TODO esta passando mais neuronios do que tem. Verica depois
//pois nos testes funcionou. Tanto nos argumentos quanto no kernel
kernelProdEscalar.setArgs(clBufferSaida1, clBufferPesos2, clBufferPesosBias2,
clBufferSaida2, qtdNeuronios_1, qtdNeuronios_1);
prodEvt = kernelProdEscalar.enqueueNDRange(queue, new int[]{qtdNeuronios_1});
//DoubleBuffer dBufferResSaida2 = clBufferSaida2.read(queue, prodEvt);
//TERCEIRA CAMADA
clBufferSaida2 = context.createDoubleBuffer(CLMem.Usage.Input,
(DoubleBuffer) clBufferSaida2.read(queue, prodEvt), true);
//TODO esta passando mais neuronios do que tem. Verica depois
//pois nos testes funcionou. Tanto nos argumentos quanto no kernel
kernelProdEscalar.setArgs(clBufferSaida2, clBufferPesos3, clBufferPesosBias3,
clBufferSaida3, qtdNeuronios_2, qtdNeuronios_2);
prodEvt = kernelProdEscalar.enqueueNDRange(queue, new int[]{qtdNeuronios_2});
//DoubleBuffer dBufferSaidaFinal = clBufferSaida3.read(queue,prodEvt);
// BACKPROPAGATION
dSaidaFinal = ((DoubleBuffer) clBufferSaida3.read(queue, prodEvt)).get(0);
erro = Param.target - dSaidaFinal;
percentualErro = Math.abs((erro / Param.target) * 100);
s3 = -2 * FuncoesCPU.derivativeSigmoid(dSaidaFinal) * erro;
//kernel = program.createKernel("s2");
kernelS2.setArgs(clBufferPesos3, dSaidaFinal, erro,
clBufferSaida2, clBufferS2);
prodEvt = kernelS2.enqueueNDRange(queue, new int[]{qtdNeuronios_2});
//DoubleBuffer dBufferResS2 = clBufferS2.read(queue,prodEvt);
clBufferS2 = context.createDoubleBuffer(CLMem.Usage.InputOutput,
(DoubleBuffer) clBufferS2.read(queue, prodEvt), true);
//kernel = program.createKernel("s1");
kernelS1.setArgs(clBufferPesos2,
clBufferS2,
clBufferSaida1,
clBufferS1,
qtdNeuronios_2);
prodEvt = kernelS1.enqueueNDRange(queue, new int[]{qtdNeuronios_1});
//DoubleBuffer dBufferResS1 = clBufferS1.read(queue,prodEvt);
clBufferS1 = context.createDoubleBuffer(CLMem.Usage.InputOutput,
(DoubleBuffer) clBufferS1.read(queue, prodEvt), true);
//ATUALIZANDO OS PESOS
//CAMADA 3
//kernel = program.createKernel("atualiza_pesos_3");
kernelAtualizaPesos3.setArgs(clBufferPesos3, clBufferPesos2, dSaidaFinal,
erro, Param.taxaAprendizado);
prodEvt = kernelAtualizaPesos3.enqueueNDRange(queue, new int[]{qtdNeuronios_2});
//DoubleBuffer dBufferResPesos3 = clBufferPesos3.read(queue,prodEvt);
clBufferPesos3 = context.createDoubleBuffer(CLMem.Usage.InputOutput,
(DoubleBuffer) clBufferPesos3.read(queue, prodEvt), true);
dBufferPesosBias3.put(0, dBufferPesosBias3.get(0) - (Param.taxaAprendizado * s3 * 1));
clBufferPesosBias3 = context.createDoubleBuffer(CLMem.Usage.InputOutput, dBufferPesosBias3, true);
//CAMADA 2
//kernel = program.createKernel("atualiza_pesos_2");
kernelAtualizaPesos2.setArgs(clBufferPesos2, clBufferS2, clBufferSaida1, qtdNeuronios_1,
Param.taxaAprendizado, clBufferPesosBias2);
prodEvt = kernelAtualizaPesos2.enqueueNDRange(queue, new int[]{qtdNeuronios_2});
//DoubleBuffer dBufferResPesos2 = clBufferPesos2.read(queue,prodEvt);
//DoubleBuffer dBufferResPesosBias2 = clBufferPesosBias2.read(queue,prodEvt);
clBufferPesos2 = context.createDoubleBuffer(CLMem.Usage.InputOutput,
(DoubleBuffer) clBufferPesos2.read(queue, prodEvt), true);
clBufferPesosBias2 = context.createDoubleBuffer(CLMem.Usage.InputOutput,
(DoubleBuffer) clBufferPesosBias2.read(queue, prodEvt), true);
//CAMADA 3
//kernel = program.createKernel("atualiza_pesos_1");
kernelAtualizaPesos1.setArgs(clBufferPesos1, clBufferS1, clBufferEntrada,
qtdNeuronios_1, Param.taxaAprendizado, clBufferPesosBias1);
prodEvt = kernelAtualizaPesos1.enqueueNDRange(queue, new int[]{qtdNeuronios_1});
//DoubleBuffer dBufferResPesos1 = clBufferPesos1.read(queue,prodEvt);
//DoubleBuffer dBufferResPesosBias1 = clBufferPesosBias1.read(queue,prodEvt);
clBufferPesos1 = context.createDoubleBuffer(CLMem.Usage.InputOutput,
(DoubleBuffer) clBufferPesos1.read(queue, prodEvt), true);
clBufferPesosBias1 = context.createDoubleBuffer(CLMem.Usage.InputOutput,
(DoubleBuffer) clBufferPesosBias1.read(queue, prodEvt), true);
}
}
System.out.println("TESTE");
for (int e = indiceTeste; e < entradas.length; e++) {
// PRIMEIRA CAMADA
kernelProdEscalar.setArgs(clBufferEntrada, clBufferPesos1, clBufferPesosBias1,
clBufferSaida1, qtdNeuronios_1, qtdNeuronios_1);
//aqui diz quantos work itens trabalharao para executar o kernel
CLEvent prodEvt = kernelProdEscalar.enqueueNDRange(queue, new int[]{qtdNeuronios_1});
//faz a leitura do 'result'
//DoubleBuffer dBufferResSaida1 = clBufferSaida1.read(queue,prodEvt);
// SEGUNDA CAMADA
clBufferSaida1 = context.createDoubleBuffer(CLMem.Usage.Input,