Skip to main content

SirojFlow

Python NumPy License PyPI version

SirojFlow is a lightweight educational deep learning framework that implements neural networks from first principles. Every stage of training, from forward propagation to backpropagation, is written manually using NumPy.


Features

Layers

  • Fully Connected (Linear)
  • Sequential model container (Sequential)
  • Activation Functions
    • ReLU
    • LeakyReLU
    • Sigmoid
    • Tanh
    • Softmax
    • Swish
    • HeavySide

Loss Functions

  • MSELoss
  • MAELoss
  • BinaryCrossentropyLoss
  • SparseCategoricalCrossentropyLoss

Optimizers

  • SGD
  • Adam

Utilities

  • DataLoader
    • Batch creation
    • Dataset shuffling
    • Optional dropping of incomplete batches

Weight Initialization

  • He
  • Xavier
  • Zero
  • Random (Default)

Installation

pip install sirojflow

Quick Example

import numpy as np

from SirojFlow.engine.nn import Sequential, Linear
from SirojFlow.engine.act import ReLU, Softmax
from SirojFlow.losses import SparseCategoricalCrossentropyLoss
from SirojFlow.optims import Adam
from SirojFlow.utils import DataLoader

x = np.random.randn(500, 20)
y = np.random.randint(5, size=500)

loader = DataLoader(x, y, batch_size=32, shuffle=True)

model = Sequential(
    Linear(20, 64),
    ReLU(),
    Linear(64, 5),
    Softmax()
)

criterion = SparseCategoricalCrossentropyLoss(model.layers[-1])
optimizer = Adam(model, lr=1e-3)

for epoch in range(20):
    total_loss = 0

    for xb, yb in loader:
        pred = model(xb)
        loss = criterion(pred, yb)

        criterion.backward()
        optimizer.step()

        total_loss += loss

    print(f"Epoch {epoch+1}: {total_loss:.4f}")

Model Summary

print(model.summary())

Project Structure

src/
└── SirojFlow/
│   ├── engine/
│   │   ├── _sirojflow.py
│   │   ├── act.py
│   │   └── nn.py
│   ├── losses.py
│   ├── optims.py
│   ├── utils.py
│   └── LICENSE
└──README.md

Framework Design

Forward Pass

Input
 │
Model
 │
Prediction
 │
Loss

Backward Pass

Loss
 │
criterion.backward()  
 │
optimizer.step()    
 │
*layers.backward()
 |
Parameter Update

SirojFlow follows a modular object-oriented design.

  • Layers perform forward propagation and gradient computation.
  • Losses compute the initial gradient i.e. of gradient of loss function with respect to the output of the last layer.
  • Optimizers drive the complete backpropagation process, and update parameters.

No automatic differentiation or computational graph is used.


Training Flow

The syntax in training process is same for all cases

prediction = model(x_batch)
loss = criterion(prediction, y_batch)

criterion.backward()
optimizer.step()

Model setup:

  1. First, import DataLoader object, it is located as sirojflow.utils. Then, load your data as loaded_data = DataLoader(x: numpy.ndarray, y: numpy.ndarray, batch_size=<int>, shuffle=<bool>, drop_last=<bool>) here,

    batch_size;
    if None: full-batch, if value <int> given, mini-batch
    
    shuffle;
    if True:
        shuffles batches every epoch
    else:
        doesn't shuffle batches
    
    drop_last;
    if True:
        drops incomplete batch
    else:
        doesn't drop incomplete batch        
    
  2. Import the Sequential layer container from sirojflow.engine.nn

  3. Now, import the Linear layer object from sirojflow.engine.nn and essential activations from sirojflow.engine.nn.act

  4. You can define your model in two ways:

    model = Sequential(
        <*layers>
    )
    

    or

    model = Sequential()
    model.add(layer1)
    model.add(layer2)
    model.add(layer3)
    ...
    ...
    

    Note: The Linear layer requires two parameter in_features and out_features because shape of linear layer is (in_features x out_features). You can even specify weight initialization for each linear layer. Shape of weight: (out_features x in_feature).

  5. Now, import required loss from sirojflow.losses and required optimizer from sirojflow.optims.

  6. To setup optimizer, you should pass entire model model into it, and you can put enter the learning rate lr: optim = <Optimizer>(model: Sequential, lr=1e-3). You can also add moment in SGD. Similarly you can experiment with moment parameters beta and gamma in Adam. Nevertheless, you can also use L2 regularization (penalty) by adding weight_decay in any optimizer.

  7. To setup the criterion function, you should pass the last layer of model model.layers[-1] to define the criterion; criterion = <Loss>(model.layers[-1]) and to find the loss, you can do: loss = criterion(pred, label)

  8. Now, you can iterate through epochs and loaded_data like:

    for epoch in range(epochs):
        for x_batch, y_batch in loaded_data:
            ...
            ...
    

    and use the same training flow syntax mentioned above


Working Principle:

  1. model(x_batch) does forward propagation for each layers, caches and intermediate values inside each layer object
  2. criterion(prediction, y_batch) returns the loss value
  3. critetion.backward() calls the .backward() of the loss function, this calculates gradient of loss with respect to output of model prediction, this gets cached as grad_next of the last layer of the model, which is passed into the loss object during criterion definition criterion = <Loss>(model.layers[-1])
  4. Optimizer does backward pass to every layer of model from last layer, from what it caches the chained gradient upto previous layer as grad_next in the current layer by calling each layer's .backward(next_grad)
  5. Then the optimizer filters updatable layer Linear which has parameters dW and dB, fetches those and updates the parameters of all linear layers.

Requirements

  • Python 3.7+
  • NumPy

License

MIT License.


Release files for SirojFlow 0.1.7

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for SirojFlow 0.1.7
File Size Uploaded
sirojflow-0.1.7.tar.gz 11.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for SirojFlow 0.1.7
File Interpreter ABI Platform
sirojflow-0.1.7-py3-none-any.whl Python 3 none any Details

Total release size: 20.9 kB

Release files / sirojflow-0.1.7.tar.gz

Download URL sirojflow-0.1.7.tar.gz
Size 11.0 kB
Tags Source
SHA-256 checksum
How to use checksums
febc39e8955133624d33a316e57a1eea8779c045d648c5e1e862d798d6884a27
BLAKE2b-256 checksum
How to use checksums
df1a92b44d62e33ea476c0db1e6396a2a6a3945798b183be1b6a8f41df6ffc81
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.4

Release files / sirojflow-0.1.7-py3-none-any.whl

Download URL sirojflow-0.1.7-py3-none-any.whl
Size 9.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9cbfd0040f39ecf2b1fe3848e05062b4cf8ff29e69ce92f32a550d5665f46359
BLAKE2b-256 checksum
How to use checksums
3114de77d3f40519632f77f26817c5fd7b05d45586164765f9c2ea1e116e7e22
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.4

Release history Release notifications | RSS feed

This release

0.1.7 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page