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)
示例#2
0
    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)