Skip to main content

A flexible deep learning framework built from scratch using only NumPy

Project description

Neuralnetlib

📝 Description

This is a handmade deep learning framework library, made in python, using numpy as its only external dependency.

I made it to challenge myself and to learn more about deep neural networks, how they work in depth.

The big part of this project, meaning the Multilayer Perceptron (MLP) part, was made in a week.

I then decided to push it even further by adding Convolutional Neural Networks (CNN), Recurrent Neural Networks (RNN), Autoencoders, Variational Autoencoders (VAE), GANs and Transformers.

Regarding the Transformers, I just basically reimplement the Attention is All You Need paper, but I had some issues with the gradients and the normalization of the attention weights. So, I decided to leave it as it is for now. It theorically works but needs a huge amount of data that can't be trained on a CPU. You can however see what each layers produce and how the attention weights are calculated here.

This project will be maintained as long as I have ideas to improve it, and as long as I have time to work on it.

📦 Features

  • Many models architectures (sequential, functional, autoencoder, transformer, gan) 🏗
  • Many layers (dense, dropout, conv1d/2d, pooling1d/2d, flatten, embedding, batchnormalization, textvectorization, lstm, gru, attention and more) 🧠
  • Many activation functions (sigmoid, tanh, relu, leaky relu, softmax, linear, elu, selu) 📈
  • Many loss functions (mean squared error, mean absolute error, categorical crossentropy, binary crossentropy, huber loss) 📉
  • Many optimizers (sgd, momentum, rmsprop, adam) 📊
  • Supports binary classification, multiclass classification, regression and text generation 📚
  • Preprocessing tools (tokenizer, pca, ngram, standardscaler, pad_sequences, one_hot_encode and more) 🛠
  • Callbacks and regularizers (early stopping, l1/l2 regularization) 📉
  • Save and load models 📁
  • Simple to use 📚

⚙️ Installation

You can install the library using pip:

pip install neuralnetlib

💡 How to use

Basic usage

See this file for a simple example of how to use the library.
For a more advanced example, see this file for using CNN.
You can also check this file for text classification using RNN.

Advanced usage

See this file for an example of how to use VAE to generate new images.
And this file for an example of how to generate new dinosaur names.

More examples in this folder.

You are free to tweak the hyperparameters and the network architecture to see how it affects the results.

🚀 Quick examples (more here)

Binary Classification

from neuralnetlib.models import Sequential
from neuralnetlib.layers import Input, Dense
from neuralnetlib.activations import Sigmoid
from neuralnetlib.losses import BinaryCrossentropy
from neuralnetlib.optimizers import SGD
from neuralnetlib.metrics import accuracy_score

# ... Preprocess x_train, y_train, x_test, y_test if necessary (you can use neuralnetlib.preprocess and neuralnetlib.utils)

# Create a model
model = Sequential()
model.add(Input(10))  # 10 features
model.add(Dense(8))
model.add(Dense(1))
model.add(Activation(Sigmoid()))  # many ways to tell the model which Activation Function you'd like, see the next example

# Compile the model
model.compile(loss_function='bce', optimizer='sgd')

# Train the model
model.fit(X_train, y_train, epochs=10, batch_size=32, metrics=['accuracy'])

Multiclass Classification

from neuralnetlib.activations import Softmax
from neuralnetlib.losses import CategoricalCrossentropy
from neuralnetlib.optimizers import Adam
from neuralnetlib.metrics import accuracy_score

# ... Preprocess x_train, y_train, x_test, y_test if necessary (you can use neuralnetlib.preprocess and neuralnetlib.utils)

# Create and compile a model
model = Sequential()
model.add(Input(28, 28, 1)) # For example, MNIST images
model.add(Conv2D(32, kernel_size=3, padding='same'), activation='relu')  # activation supports both str...
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=2))
model.add(Dense(64, activation='relu'))
model.add(Dense(10, activation=Softmax()))  # ... and ActivationFunction objects
model.compile(loss_function='categorical_crossentropy', optimizer=Adam())


model.compile(loss_function='categorical_crossentropy', optimizer=Adam())  # same for loss_function and optimizer

# Train the model
model.fit(X_train, y_train_ohe, epochs=5, metrics=['accuracy'])

Regression

from neuralnetlib.losses import MeanSquaredError
from neuralnetlib.metrics import accuracy_score

# ... Preprocess x_train, y_train, x_test, y_test if necessary (you can use neuralnetlib.preprocess and neuralnetlib.utils)

# Create and compile a model
model = Sequential()
model.add(Input(13))
model.add(Dense(64, activation='leakyrelu'))
model.add(Dense(1), activation="linear")

model.compile(loss_function="mse", optimizer='adam')  # you can either put acronyms or full name

# Train the model
model.fit(X_train, y_train, epochs=100, batch_size=128, metrics=['accuracy'])

You can also save and load models:

# Save a model
model.save('my_model.json')

# Load a model
model = Model.load('my_model.json')

📜 Output of the example file

Here is the decision boundary on a Binary Classification (breast cancer dataset):

decision_boundary

[!NOTE] PCA (Principal Component Analysis) was used to reduce the number of features to 2, so we could plot the decision boundary. Representing n-dimensional data in 2D is not easy, so the decision boundary may not be always accurate. I also tried with t-SNE, but the results were not good.

Here is an example of a model training on the mnist using the library

cli

Here is an example of a loaded model used with Tkinter:

gui

Here, I decided to print the first 10 predictions and their respective labels to see how the network is performing.

plot

Here is the generated dinosaur names using a simple RNN and a list of existing dinosaur names.

dino

You can of course use the library for any dataset you want.

✏️ Edit the library

You can pull the repository and run:

pip install -e .

And test your changes on the examples.

🎯 TODO

  • Add more preprocessing tools
  • Add support for stream dataset loading to allow loading large datasets (larger than your RAM)
  • Add more callbacks
  • Add more layers
  • Add more model architecture support
  • Add cuDNN support to allow the use of GPUs
  • Visual updates (tabulation of model.summary() parameters calculation, colorized progress bar, etc.)

🐞 Know issues

  • The transformer has gradient issues (normalization and often constant attention weights after a few epochs)
  • The save feature of some very rare cases (layers/models) aren't working properly (I just need to read my old code again)

✍️ Authors

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

neuralnetlib-4.0.0.tar.gz (78.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

neuralnetlib-4.0.0-py3-none-any.whl (78.6 kB view details)

Uploaded Python 3

File details

Details for the file neuralnetlib-4.0.0.tar.gz.

File metadata

  • Download URL: neuralnetlib-4.0.0.tar.gz
  • Upload date:
  • Size: 78.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.0 CPython/3.10.15

File hashes

Hashes for neuralnetlib-4.0.0.tar.gz
Algorithm Hash digest
SHA256 518c145b9396a544bf5a369d07bbf32d57d357742cc7ccdfd6b863397d193091
MD5 6870debc771cf6c609589ea6bd1b044d
BLAKE2b-256 894103d6d7f3ac2383b33ac9f2849e43c688f646da989e84b24375d46452404f

See more details on using hashes here.

File details

Details for the file neuralnetlib-4.0.0-py3-none-any.whl.

File metadata

  • Download URL: neuralnetlib-4.0.0-py3-none-any.whl
  • Upload date:
  • Size: 78.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.0 CPython/3.10.15

File hashes

Hashes for neuralnetlib-4.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8b7322263a9ebe7bc8f5a9a5aa1415e823ec7fcd2a61cbfab1bb6fac19c761c9
MD5 89f027100140a3612024fdf16fb41e55
BLAKE2b-256 62ccbb0149ef767a045f76da9cc0d423fc63b4e405102fadee35fe2215bbe0f6

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page