subir
Python-backpropagation
Exemplo básico de backpropagation em Python usando NumPy
Projeto
Usando backpropagation para treinar uma rede neural simples a resolver o problema XOR. A rede aprende ajustando os pesos automaticamente com base no erro.
import numpy as np
# Função de ativação Sigmoid e sua derivada
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x):
return x * (1 - x) # Derivada da sigmoid
# Dados de entrada (4 exemplos, 2 características)
X = np.array([[0, 0],
[0, 1],
[1, 0],
[1, 1]])
# Saída esperada
y = np.array([[0], [1], [1], [0]]) # Problema do XOR
# Inicializa pesos aleatórios
np.random.seed(42)
pesos_entrada_oculta = np.random.uniform(-1, 1, (2, 5)) # 2 entradas -> 5 neurônios ocultos
pesos_oculta_saida = np.random.uniform(-1, 1, (5, 1)) # 5 neurônios ocultos -> 1 saída
# Taxa de aprendizado
learning_rate = 0.3
# Treinamento por 20.000 iterações
for epoch in range(20000):
# Forward Pass
camada_oculta = sigmoid(np.dot(X, pesos_entrada_oculta)) # Entrada -> Oculta
camada_saida = sigmoid(np.dot(camada_oculta, pesos_oculta_saida)) # Oculta -> Saída
# Erro
erro = y - camada_saida
# Backpropagation
d_saida = erro * sigmoid_derivative(camada_saida) # Gradiente da saída
erro_oculta = d_saida.dot(pesos_oculta_saida.T) # Propagação do erro para a camada oculta
d_oculta = erro_oculta * sigmoid_derivative(camada_oculta) # Gradiente da oculta
# Atualização dos pesos
pesos_oculta_saida += camada_oculta.T.dot(d_saida) * learning_rate
pesos_entrada_oculta += X.T.dot(d_oculta) * learning_rate
# Exibir erro a cada 1000 iterações
if epoch % 1000 == 0:
print(f"Erro na época {epoch}: {np.mean(np.abs(erro)):.4f}")
# Teste após treinamento
print("\nSaída final da rede após treinamento:")
print(camada_saida)
Usando a função de ativação Tanh
import numpy as np
# Função de ativação tanh e sua derivada
def tanh(x):
return np.tanh(x)
def tanh_derivative(x):
return 1 - x**2
# Dados de entrada (4 exemplos, 2 características)
X = np.array([[0, 0],
[0, 1],
[1, 0],
[1, 1]])
# Saída esperada
y = np.array([[0], [1], [1], [0]]) # Problema do XOR
# Inicializa pesos aleatórios
np.random.seed(42)
pesos_entrada_oculta = np.random.uniform(-1, 1, (2, 5)) # 2 entradas -> 5 neurônios ocultos
pesos_oculta_saida = np.random.uniform(-1, 1, (5, 1)) # 5 neurônios ocultos -> 1 saída
# Taxa de aprendizado
learning_rate = 0.3
# Treinamento por 20.000 iterações
for epoch in range(20000):
# Forward Pass
camada_oculta = tanh(np.dot(X, pesos_entrada_oculta)) # Entrada -> Oculta
camada_saida = tanh(np.dot(camada_oculta, pesos_oculta_saida)) # Oculta -> Saída
# Erro
erro = y - camada_saida
# Backpropagation
d_saida = erro * tanh_derivative(camada_saida) # Gradiente da saída
erro_oculta = d_saida.dot(pesos_oculta_saida.T) # Propagação do erro para a camada oculta
d_oculta = erro_oculta * tanh_derivative(camada_oculta) # Gradiente da oculta
# Atualização dos pesos
pesos_oculta_saida += camada_oculta.T.dot(d_saida) * learning_rate
pesos_entrada_oculta += X.T.dot(d_oculta) * learning_rate
# Exibir erro a cada 1000 iterações
if epoch % 1000 == 0:
print(f"Erro na época {epoch}: {np.mean(np.abs(erro)):.4f}")
# Teste após treinamento
print("\nSaída final da rede após treinamento:")
print(camada_saida)