Este projeto é uma implementação didática e pura em Python de uma Rede Neural Artificial (ANN) do zero, sem o uso de frameworks de aprendizado de máquina como TensorFlow ou PyTorch. O objetivo é focar nos fundamentos matemáticos e na arquitetura de código que regem o funcionamento de uma rede neural.
Este guia serve como material de apoio para estudantes e desenvolvedores que desejam entender a implementação de uma Rede Neural Artificial (ANN) construída puramente em Python, focando nos fundamentos matemáticos, estatísticos e na arquitetura de código, sem o uso de frameworks externos.
A implementação é baseada nos conceitos apresentados no livro Classic Computer Science Problems de David Kopec.
This project is based on the neural network implementation from the book:
"Classic Computer Science Problems in Python" by David Kopec (2018)
Original repository: https://github.com/davecom/ClassicComputerScienceProblemsInPython
The original code is licensed under the Apache License 2.0.
This project complies with that license and includes proper attribution in all derived files.
This project should be understood as an educational extension and adaptation, not a fully original implementation.
- Arquitetura e Componentes
- Matemática e Funções Auxiliares
- Treinamento e Aprendizado
- Estrutura do Código
- Como Executar os Exemplos
- Referências
O projeto segue uma arquitetura modular, onde cada elemento fundamental da rede neural é representado por uma classe ou módulo Python.
Cada neurônio recebe dados, processa-os e decide o quanto "disparar" de sinal para o próximo.

A unidade básica de processamento. Cada neurônio é responsável por:
- Armazenar seus pesos (
weights) e viés (implícito no cálculo do produto escalar com um viés de entrada, ou como parte dos pesos, dependendo da implementação exata, mas o código foca em pesos e umoutput_cache). - Realizar a combinação linear (produto escalar) das entradas com seus pesos.
- Aplicar a função de ativação (Sigmoide) ao resultado.
- Armazenar o delta de erro para a fase de backpropagation.
Uma camada é uma coleção de neurônios que operam em paralelo. A classe Layer gerencia:
- A criação e inicialização dos neurônios.
- A propagação dos sinais de entrada para todos os neurônios da camada.
- O cálculo dos deltas de erro para a fase de backpropagation (métodos
calculate_deltas_for_output_layerecalculate_deltas_for_hidden_layer).
A classe Network é o orquestrador principal, responsável por:
- Definir a estrutura da rede (número de camadas e neurônios em cada uma).
- Gerenciar a sequência de camadas.
- Implementar os métodos de treinamento (
train) e validação (validate). - Propagar o sinal de entrada através de todas as camadas (
outputs).
O módulo util.py contém as funções matemáticas essenciais para o funcionamento da rede:
| Função | Descrição | Fórmula Matemática |
|---|---|---|
dot_product |
Calcula o produto escalar entre dois vetores (entradas e pesos). | |
sigmoid |
Função de ativação utilizada para "esmagar" o valor de saída do neurônio para um intervalo entre 0 e 1. | |
derivative_sigmoid |
Derivada da função Sigmoide, crucial para o cálculo do gradiente no backpropagation. | |
normalize_by_feature_scaling |
Função de pré-processamento de dados que normaliza cada coluna do dataset para o intervalo |
O aprendizado da rede é baseado no algoritmo de Backpropagation, que ajusta os pesos para minimizar o erro entre a saída prevista e a saída esperada.
A fase de propagação direta (outputs em Network) é o processo de levar a entrada através da rede, camada por camada, até a saída final. O resultado de uma camada serve como entrada para a próxima.
A fase de propagação reversa (backpropagate em Network) é o coração do aprendizado e envolve os seguintes passos:
- Cálculo do Erro: O erro é calculado na camada de saída.
- Propagação do Erro: O erro é propagado de volta, da camada de saída para as camadas ocultas.
- Cálculo dos Deltas: Para cada neurônio, é calculado o delta (a contribuição do neurônio para o erro total), usando a derivada da função de ativação.
- Atualização dos Pesos: Os pesos são ajustados na direção oposta ao gradiente do erro, multiplicados pela Taxa de Aprendizado (
learning_rate).
O projeto está organizado da seguinte forma:
ann/
├── Core/
│ ├── layer.py # Implementa a Camada
│ ├── network.py # Implementa a Rede Neural (Orquestrador)
│ ├── neuron.py # Implementa o Neurônio
│ └── util.py # Funções matemáticas e de pré-processamento
├── examples/
│ ├── iris_test.py # Exemplo de classificação do dataset Iris
│ └── wine_test.py # Exemplo de classificação do dataset Wine
Para testar a rede neural, você pode executar os exemplos de classificação inclusos:
- Pré-requisitos: Certifique-se de ter o Python e as libs necessárias instaladas, estas últimas se encontram no arquivo requirements.txt. O projeto utiliza apenas bibliotecas padrão (como
csvetyping). É aconselhável ter um ambiente Python para este projeto. A criação é simples e usa os seguintes comandos:
mkdir ~/envs
python3 -m venv ~/envs/positron
source ~/envs/positron/bin/activatee para instalar pacotes básicos use os comandos:
pip3 install --upgrade pip
pip3 install numpy pandas matplotlib seaborn scikit-learn- Execução: Navegue até a pasta
ann/examplese execute o arquivo desejado.
Exemplo: Classificação do Dataset Iris
cd ~/python/ANN # diretório que contém a pasta 'ann'
~/envs/positron/bin/python -m ann.examples.iris_testO script iris_test.py carrega o dataset iris.csv, normaliza os dados, treina a rede com 140 amostras por 50 vezes e testa a acurácia com as 10 amostras restantes. O script wine_test.py carrega o dataset wine.csv normaliza os dados, treina a rede com 150 amostras por 10 vezes e testa com 28 dados.
Este projeto é uma implementação prática dos conceitos de redes neurais multicamadas com backpropagation, inspirada no trabalho de:
- Kopec, David. Classic Computer Science Problems. Manning Publications, 2019. (Referência principal para a arquitetura e lógica de implementação).