Skip to content

arnavkomaragiri/riptide

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Riptide

A deep learning library authored by Arnav Komaragiri

Paper Written in EECS Student Magazine 2021-2022 Edition

Note: This isn't PyTorch, I know the syntax looks a lot like it, but I just really like PyTorch syntax.

Example Code:

import riptide
import tqdm

import numpy as np

class DenseModel(riptide.layers.Module):
    def __init__(self, in_features, hidden_features, out_features):
        self.linear_head = riptide.layers.Linear(in_features, hidden_features, initialization="lecun", drop_connect=True, p=0.5)
        self.linear_tail = riptide.layers.Linear(hidden_features, out_features, initialization="xavier")

        self.act = riptide.layers.ELU()
        self.sigmoid = riptide.layers.Sigmoid()

    def forward(self, x):
        x = self.linear_head(x)
        x = self.act(x)

        x = self.linear_tail(x)
        x = self.sigmoid(x)
        return x
        
data_path = "HW2_datafiles"
img_path, label_path = "MNISTnumImages5000_balanced.txt", "MNISTnumLabels5000_balanced.txt"

batch_size = 40
if not os.path.exists("train.pkl") or not os.path.exists("test.pkl"):
    dataset, mean, std = load_dataset(os.path.join(data_path, img_path), os.path.join(data_path, label_path), standardize=True)
    train, test = stratified_train_test_split(dataset)

    one_hot_train, one_hot_test = one_hot_encode(train, 10), one_hot_encode(test, 10)

    batch_train, batch_test = batch_dataset(one_hot_train, batch_size), batch_dataset(one_hot_test, batch_size)
    save_dataset(batch_train, "train.pkl")
    save_dataset(batch_test, "test.pkl")
else:
    print("Loading Cached Datasets...")
    batch_train, batch_test = read_dataset("train.pkl"), read_dataset("test.pkl")

model = DenseModel(784, 100, 10)
optimizer = riptide.optim.Adam(model.parameters(), lr=0.0005, minibatch_size=minibatch_size)
for i in range(epochs):
    # train set
    model.train()

    avg_loss, num_correct = 0, 0
    with tqdm(batch_train, unit="batch") as t_batch:
        for batch in t_batch:
            idx = np.arange(len(batch))
            np.random.shuffle(idx)
            idx = idx[:minibatch_size]

            model.zero_grad()
            for j, data in enumerate(batch[idx]):
                img, label = data[0], data[1]

                out = model(img)
                loss = loss_fn(label, out)
                avg_loss += float(loss.data)
                t_batch.set_postfix(loss=avg_loss / (len(batch_train) * (j + 1)))
                num_correct += int(np.argmax(out.data) == np.argmax(label.data))
                loss.backward()
            optimizer.step()

Example Conditional Model:

import riptide
import tqdm

import numpy as np

class DenseModel(riptide.layers.Module):
    def __init__(self, in_features, hidden_features, out_features):
        self.linear_head = riptide.layers.Linear(in_features, hidden_features, initialization="lecun", drop_connect=True, p=0.5)
        self.linear_tail = riptide.layers.Linear(hidden_features, out_features, initialization="xavier")
        self.rand_tail = riptide.layers.Linear(out_features, out_features, initialization="xavier")

        self.act = riptide.layers.ELU()
        self.sigmoid = riptide.layers.Sigmoid()

    def forward(self, x):
        x = self.linear_head(x)
        x = self.act(x)

        x = self.linear_tail(x)
        x = self.sigmoid(x)
        if np.random.uniform() > 0.5:
            x = self.rand_tail(x)
        return x
        
data_path = "HW2_datafiles"
img_path, label_path = "MNISTnumImages5000_balanced.txt", "MNISTnumLabels5000_balanced.txt"

batch_size = 40
if not os.path.exists("train.pkl") or not os.path.exists("test.pkl"):
    dataset, mean, std = load_dataset(os.path.join(data_path, img_path), os.path.join(data_path, label_path), standardize=True)
    train, test = stratified_train_test_split(dataset)

    one_hot_train, one_hot_test = one_hot_encode(train, 10), one_hot_encode(test, 10)

    batch_train, batch_test = batch_dataset(one_hot_train, batch_size), batch_dataset(one_hot_test, batch_size)
    save_dataset(batch_train, "train.pkl")
    save_dataset(batch_test, "test.pkl")
else:
    print("Loading Cached Datasets...")
    batch_train, batch_test = read_dataset("train.pkl"), read_dataset("test.pkl")

model = DenseModel(784, 100, 10)
optimizer = riptide.optim.Adam(model.parameters(), lr=0.0005, minibatch_size=minibatch_size)
for i in range(epochs):
    # train set
    model.train()

    avg_loss, num_correct = 0, 0
    with tqdm(batch_train, unit="batch") as t_batch:
        for batch in t_batch:
            idx = np.arange(len(batch))
            np.random.shuffle(idx)
            idx = idx[:minibatch_size]

            model.zero_grad()
            for j, data in enumerate(batch[idx]):
                img, label = data[0], data[1]

                out = model(img)
                loss = loss_fn(label, out)
                avg_loss += float(loss.data)
                t_batch.set_postfix(loss=avg_loss / (len(batch_train) * (j + 1)))
                num_correct += int(np.argmax(out.data) == np.argmax(label.data))
                loss.backward()
            optimizer.step()

About

Custom deep learning library for backpropagation across arbitrary architectures using pure NumPy

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages