Este projeto implementa uma rede neural simples do zero para classificar o conjunto de dados MNIST usando NumPy. A rede é treinada usando gradiente descendente e avaliada em um conjunto de testes. Este README explica o pré-processamento de dados, a arquitetura da rede neural, a propagação para frente e para trás, e a atualização dos parâmetros.
- Rede Neural MNIST do Zero
O conjunto de dados MNIST consiste em imagens em tons de cinza de 28x28 pixels de dígitos manuscritos (0-9). O conjunto de dados é dividido em conjuntos de treinamento e teste:
train-images.idx3-ubyte
: Imagens de treinamentotrain-labels.idx1-ubyte
: Rótulos de treinamentot10k-images.idx3-ubyte
: Imagens de testet10k-labels.idx1-ubyte
: Rótulos de teste
-
Carregar os Dados:
- Use
load_mnist_images
para carregar os dados das imagens e remodelá-los para (número de imagens, 28, 28). - Use
load_mnist_labels
para carregar os dados dos rótulos.
- Use
-
Achatar e Normalizar:
- Achate cada imagem de 28x28 em um vetor de 784 dimensões.
- Normalize os valores dos pixels para ficarem entre 0 e 1.
-
Embaralhar e Dividir:
- Embaralhe os dados de treinamento.
- Divida os dados em conjuntos de treinamento e desenvolvimento.
A rede neural consiste em:
- Camada de Entrada: 784 neurônios (um para cada pixel da imagem 28x28).
- Camada Oculta: 128 neurônios com ativação ReLU.
- Camada de Saída: 10 neurônios com ativação softmax (um para cada classe de dígitos).
-
Camada Oculta:
- Quando
$W1 \ne 0$ , a equação é:$Z1 = W1 \cdot X + b1$ - A ativação é:
$A1 = \text{ReLU}(Z1)$
- Quando
-
Camada de Saída:
- Quando
$W2 \ne 0$ , a equação é:$Z2 = W2 \cdot A1 + b2$ - A ativação é:
$A2 = \text{softmax}(Z2)$
- Quando
-
ReLU (Rectified Linear Unit):
$\text{ReLU}(z) = \max(0, z)$
-
Softmax:
$\text{softmax}(z) = \frac{\exp(z)}{\sum \exp(z)}$
-
Camada de Saída:
- O gradiente é:
$dZ2 = A2 - Y_{\text{one-hot}}$ - A derivada do peso é:
$dW2 = \frac{1}{m} dZ2 \cdot A1^T$ - A derivada do viés é:
$db2 = \frac{1}{m} \sum dZ2$
- O gradiente é:
-
Camada Oculta:
- O gradiente é:
$dZ1 = W2^T \cdot dZ2 \cdot \text{ReLU}'(Z1)$ - A derivada do peso é:
$dW1 = \frac{1}{m} dZ1 \cdot X^T$ - A derivada do viés é:
$db1 = \frac{1}{m} \sum dZ1$
- O gradiente é:
-
Derivada da ReLU:
$\text{ReLU}'(z) = 1 \text{ se } z > 0 \text{ senão } 0$
- Atualize os parâmetros usando os gradientes calculados durante a propagação para trás:
$W1 = W1 - \alpha \cdot dW1$ $b1 = b1 - \alpha \cdot db1$ $W2 = W2 - \alpha \cdot dW2$ $b2 = b2 - \alpha \cdot db2$
- Treine a rede neural usando gradiente descendente por um número especificado de iterações.
- Avalie a precisão do modelo no conjunto de testes.
Para executar o código, siga estes passos:
- Certifique-se de que você tem os arquivos do conjunto de dados MNIST (
train-images.idx3-ubyte
,train-labels.idx1-ubyte
,t10k-images.idx3-ubyte
,t10k-labels.idx1-ubyte
). - Execute o script substituindo
filename
pelo caminho dos seus arquivos.