def treino(self, entrada, saidaFinal): # Entrada -> Oculta entrada = Matriz.matriz(entrada) oculta = Matriz.mult(self.pesos_EO, entrada) oculta = Matriz.soma(oculta, self.bias_EO) oculta = Matriz.sigmoid(oculta) # Oculta -> Saida saida = Matriz.mult(self.pesos_OS, oculta) saida = Matriz.soma(saida, self.bias_OS) saida = Matriz.sigmoid(saida) #BACKPROPAGATION #Saida -> Oculta saidaFinal = Matriz.matriz(saidaFinal) saida_error = Matriz.sub(saidaFinal, saida) deriv_saida = Matriz.derivadaSigmoid(saida) oculta_t = Matriz.transposta(oculta) gradient_OS = Matriz.hadamard(deriv_saida, saida_error) gradient_OS = Matriz.mult_escalar(gradient_OS, self.taxa_aprendizado) delta_pesos_OS = Matriz.mult(gradient_OS, oculta_t) #Oculta -> Entrada pesos_OS_t = Matriz.transposta(self.pesos_OS) oculta_error = Matriz.mult(pesos_OS_t, saida_error) deriv_oculta = Matriz.derivadaSigmoid(oculta) entrada_t = Matriz.transposta(entrada) gradient_EO = Matriz.hadamard(deriv_oculta, oculta_error) gradient_EO = Matriz.mult_escalar(gradient_EO, self.taxa_aprendizado) delta_pesos_EO = Matriz.mult(gradient_EO, entrada_t) #Atualizando Pesos self.pesos_OS = Matriz.soma(self.pesos_OS, delta_pesos_OS) self.pesos_EO = Matriz.soma(self.pesos_EO, delta_pesos_EO)
def backpropagation(self, entrada, esperado): """transformando a entrada em matriz""" entrada = Matriz.array2object(entrada) """feedfoward""" """ CAMADA DE ENTRADA PARA CAMADA OCULTA""" print("\n------ CAMADA ENTRADA => CAMADA OCULTA -----") camada_oculta = Matriz.multiplicaDuasMatriz(self.pesos_entrada_oculta, entrada) camada_oculta = Matriz.somarDuasMatriz(camada_oculta, self.bias_entrada_oculta) camada_oculta.aplicarSigmoid() camada_oculta.printMatriz() """ CAMADA OCULTA PARA CAMADA DE SAIDA""" print("\n------CAMADA OCULTA -> CAMADA SAIDA-----") camada_saida = Matriz.multiplicaDuasMatriz(self.pesos_oculta_saida, camada_oculta) camada_saida = Matriz.somarDuasMatriz(camada_saida, self.bias_oculta_saida) camada_saida.aplicarSigmoid() camada_saida.printMatriz() """backpropagation""" esperado = Matriz.array2object(esperado) """SAIDA P/ OCULTA""" """calculo do erro""" erro_de_saida = Matriz.subtrairMatriz(esperado, camada_saida) #erro_de_saida.printMatriz() derivada_da_saida = self.derivadaElementosMatriz(camada_saida) #derivada_da_saida.printMatriz() """multiplicacao hadamard""" gradiente = Matriz.hadamard(erro_de_saida, derivada_da_saida) #gradiente.printMatriz() """aplicando learning_rate""" gradiente = Matriz.produtoEscalar(gradiente, self.learning_rate) """AJUSTAR BIA""" self.bias_oculta_saida = Matriz.somarDuasMatriz( self.bias_oculta_saida, gradiente) """multiplicando pela camada oculta transposta""" oculta_transposta = Matriz.transporMatriz(camada_oculta) gradiente = Matriz.multiplicaDuasMatriz(gradiente, oculta_transposta) #gradiente.printMatriz() self.pesos_oculta_saida = Matriz.somarDuasMatriz( self.pesos_oculta_saida, gradiente) """""" """CAMADA OCULTA P/ ENTRADA """ peso_oculta_saida_transposta = Matriz.transporMatriz( self.pesos_oculta_saida) erro_oculta = Matriz.multiplicaDuasMatriz(peso_oculta_saida_transposta, erro_de_saida) #erro_oculta.printMatriz() """aplicando derivada camada oculta""" derivada_camada_oculta = self.derivadaElementosMatriz(camada_oculta) entrada_transposta = Matriz.transporMatriz(entrada) gradiente_oculta = Matriz.hadamard(erro_oculta, derivada_camada_oculta) gradiente_oculta = Matriz.produtoEscalar(gradiente_oculta, self.learning_rate) """AJUSTAR BIA""" self.bias_entrada_oculta = Matriz.somarDuasMatriz( self.bias_entrada_oculta, gradiente_oculta) gradiente_oculta = Matriz.multiplicaDuasMatriz(gradiente_oculta, entrada_transposta) self.pesos_entrada_oculta = Matriz.somarDuasMatriz( self.pesos_entrada_oculta, gradiente_oculta)