Uma biblioteca de redes neurais simples para classificação em 3 linguagens diferentes: C, C++ e Python
Em C e C++ todas as operações matriciais e processamento de dados foram implementados do 0
Em Python foi utilizada apenas a biblioteca NumPy. As funções, parâmetros e retornos foram implementados para serem similares à biblioteca sklearn (scikit-learn)
As bibliotecas em C e C++ não possuem dependências além do compilador para as linguagens (gcc e g++)
Clone o repositório para sua máquina
git clone https://github.com/luccacb16/NNFromScratch.git
Acesse a raiz do projeto
cd NNFromScratch
Instale as dependências (apenas numpy)
pip install -r requirements.txt
ou
pip install numpy
Para as as linguagens C e C++, os datasets devem ser arquivos de texto, em que a primeira linha deve conter o número da quantidade de dados e na linha seguinte a quantidade de colunas (atributos) de dataset seguido de 1 (Ex: 784 1). A coluna que indica o rótulo da classe deve ser a última.
Inclua o arquivo da biblioteca:
#include "NN.h"
Crie uma variável do tipo 'NN' que receberá o retorno da função 'initNN', que possui os parâmetros:
- taminput (int): Quantidade de colunas (atributos) do dataset
- numhidden (int): Número de camadas escondidas desejadas
- numoutput (int): Número de classes
NN Net = initNN(taminput, numhidden, numoutput);
Para treinar o modelo utilize a função sem retorno 'trainNN', que possui os parâmetros:
- filename (str): Caminho para um arquivo de texto do dataset de treino
- Net (NN): Variável que carrega a estrutura da rede neural criada no passo anterior
- learningrate (double): Parâmetro de aprendizado (recomendado: 0.001)
trainNN('train.txt', Net, 0.001);
Para testar e obter a acurácia do modelo utilize a função 'testNN', que possui os parâmetros:
- filename (str): Caminho para um arquivo de texto do dataset de teste
- Net (NN): Variável que carrega a estrutura da rede neural
- wandbfile (str): Caminho para um arquivo de texto que armazenará as matrizes de weights e biases caso a acurácia seja >= 90%
testNN('test.txt', Net, 'wandb.txt');
Inclua o arquivo da biblioteca:
#include "NN.h"
Adicione o namespace 'neuralnetwork'
using namespace neuralnetwork
Crie um objeto NN com os parâmetros:
- taminput (int): Quantidade de colunas (atributos) do dataset
- numhidden (int): Número de camadas escondidas desejadas
- numoutput (int): Número de classes
NN Net(taminput, numhidden, numoutput);
Para treinar o modelo utilize a função sem retorno 'trainNN', que possui os parâmetros:
- filename (str): Caminho para um arquivo de texto do dataset de treino
- func (ponteiro de função): Função de ativação desejada (ReLU, Sigmoid, anh)
- learningrate (double): Parâmetro de aprendizado (recomendado: 0.001)
Net.trainNN('train.txt', ReLU, 0.001)
Para testar e obter a acurácia do modelo utilize a função 'testNN', que possui os parâmetros:
- filename (str): Caminho para um arquivo de texto do dataset de teste
- wandbfile (str): Caminho para um arquivo de texto que armazenará as matrizes de weights e biases caso a acurácia seja >= 90%
Net.testNN('test.txt', 'wandb.txt')
Importe a biblioteca
from nn import *
Carregue o arquivo csv do dataset num pandas DataFrame e separe entre dados de input (atributos) e o rótulo. Utilize a função 'split' para dividí-los em treino e teste. Ela possui como parâmetros:
- x (np.ndarray): Atributos
- y (np.ndarray): Rótulos
- test_size (float): Porcentagem do dataset que será de teste (default = 0.2)
A função split retorna 4 np.ndarrays: x_train, y_train, x_test, y_test, que são os pares de atributos-rótulos de treino e teste, respectivamente
data = pd.read_csv('scripts/mnist.csv')
y = data['label']
x = data.drop('label', axis=1)
x_train, y_train, x_test, y_test = split(x, y, test_size=0.2)
Crie um objeto NN com os parâmetros:
- numhidden (int): Quantidade de camadas escondidas desejadas (default = 10)
- activation (str): Função de ativação (ReLU, Sigmoid, tanh) (default = ReLU)
- epochs (int): Número de iterações para o treinamento (default = 100)
nn = NN(numhidden=10, activation='relu', epochs=100)
Utilize a função 'train' para treinar o modelo. Parâmetros:
- X (np.ndarray): X de treinamento (x_train)
- Y (np.ndarray): Y de treinamento (y_train)
- lr (float): Learning rate (default = 0.001)
A função train retorna o objeto do modelo treinado
Utilize a função 'predict' para obter as predições dos rótulos de cada caso de teste. Parâmetros: - X (np.ndarray): Atributos de teste (x_test)
A função predict retorna uma lista com as predições (número da classe)
Para obter a acurácia do modelo, utilize a função 'score', com parâmetros:
- predictions (list): Predições obtidas no retorno da função 'predict'
- Y (np.ndarray): Rótulos de teste (y_test)
A função score retorna um float que é a porcentagem de acurácia (0 <= acurácia <= 1)
model = nn.train(x_train, y_train, lr=0.001)
predictions = model.predict(x_test)
accuracy = model.score(predictions, y_test)
Para um teste rápido, basta mover os arquivos da pasta 'scripts' junto dos outros arquivos e executar o arquivo 'main.py'