From 28f8fc8704b82653433030fe06bac289ff1e79f7 Mon Sep 17 00:00:00 2001 From: hocine Date: Fri, 29 Dec 2023 21:31:27 +0100 Subject: [PATCH 1/4] first commit --- rbm/main.py | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 rbm/main.py diff --git a/rbm/main.py b/rbm/main.py new file mode 100644 index 0000000000..dd251fd54b --- /dev/null +++ b/rbm/main.py @@ -0,0 +1,100 @@ +import torch +import torch.nn as nn +import pandas as pd +from torch.utils.data import Dataset, DataLoader +from torchvision import datasets, transforms +import matplotlib.pyplot as plt +import torch.optim as optim + +device = "cuda" if torch.cuda.is_available() else "cpu" + +batch_size = 200 +epochs = 10 +lr = 0.001 +nh = 1000 +data = datasets.MNIST( + root='~/.pytorch/MNIST_data/', + download=True + ).data +data = torch.where(data > 1, torch.tensor(1), torch.tensor(0)).to(torch.float32) + +train_loader = DataLoader(dataset=data, batch_size=batch_size, shuffle=True) + +def show_imgs(img_tensors): + fig, axs = plt.subplots(nrows=10, ncols=10) + for i in range(100): + axs[i//10, i%10].imshow(img_tensors[i].view(28, 28), cmap='binary_r') + axs[i//10, i%10].set_axis_off() + plt.show() + + + + +class RBM(nn.Module): + def __init__(self, n_v, n_h): + super().__init__() + self.nv = n_v + self.nh = n_h + self.b = nn.Parameter(torch.normal(0, 1, size=[n_v], dtype=torch.float32, requires_grad=True)) + self.c = nn.Parameter(torch.normal(0, 1, size=[n_h], dtype=torch.float32, requires_grad=True)) + self.W = nn.Parameter(torch.normal(0, 1, size=(n_v, n_h), dtype=torch.float32, requires_grad=True)) + self.sig = nn.Sigmoid() + + def forward(self, v_d, v_m): + with torch.no_grad(): + h_d = self.h_given_v(v_d) + v_m, h_m = self.gibbs_update(v_m, 50) + positive_phase = self.b @ v_d.T + self.c @ h_d.T + ((v_d @ self.W) * h_d).sum(dim=-1) + negative_phase = self.b @ v_m.T + self.c @ h_m.T + ((v_m @ self.W) * h_m).sum(dim=-1) + llh = positive_phase - negative_phase + m = llh.size(0) + llh = -(llh.sum())/m + return llh, v_m + + def gibbs_update(self, v, k): + for i in range(k): + h = self.h_given_v(v) + v = self.v_given_h(h) + return v, h + + def h_given_v(self, v): + pmf = self.sig(self.c + v @ self.W) + return torch.bernoulli(pmf) + + def v_given_h(self, h): + pmf = self.sig(self.b + h @ self.W.T) + return torch.bernoulli(pmf) + + def sample(self, n): + with torch.no_grad(): + v = torch.bernoulli(torch.rand(n, self.nv)).to(self.W.device) + v, _ = self.gibbs_update(v, 100) + return v + + + +model = RBM(784, nh).to(device) +optimizer = optim.Adam(model.parameters(), lr=lr) +for i in range(epochs): + for batch in train_loader: + v = torch.bernoulli(torch.rand(batch_size,784)).to(device) + b = batch.view(batch_size, -1).to(device) + loss, _ = model(b, v) + optimizer.zero_grad() + loss.backward() + optimizer.step() + if i % 10 == 0: + print(f"step: {i}/{epochs} loss: {loss.item()}") + +mse = nn.MSELoss() +def reconst_err(model): + with torch.no_grad(): + err = 0.0 + for batch in train_loader: + b = batch.view(batch_size, -1).to(device) + v = model(b.to(device), b.to(device))[1] + err += mse(b,v) + return err/len(train_loader) + + +show_imgs(model.sample(100).cpu()) \ No newline at end of file From 31d9d0c762921a538c92208b76266f890bde2eb6 Mon Sep 17 00:00:00 2001 From: hocine Date: Sat, 30 Dec 2023 20:50:33 +0100 Subject: [PATCH 2/4] added comments --- rbm/README.MD | 6 ++ rbm/main.py | 171 +++++++++++++++++++++++++++---------------- rbm/requirements.txt | 3 + 3 files changed, 118 insertions(+), 62 deletions(-) create mode 100644 rbm/README.MD create mode 100644 rbm/requirements.txt diff --git a/rbm/README.MD b/rbm/README.MD new file mode 100644 index 0000000000..f3d99dfac8 --- /dev/null +++ b/rbm/README.MD @@ -0,0 +1,6 @@ +# Restricted Boltzmann Machine Example + +```bash +pip install -r requirements.txt +python main.py +``` diff --git a/rbm/main.py b/rbm/main.py index dd251fd54b..f86d852af3 100644 --- a/rbm/main.py +++ b/rbm/main.py @@ -1,100 +1,147 @@ import torch import torch.nn as nn -import pandas as pd -from torch.utils.data import Dataset, DataLoader -from torchvision import datasets, transforms +from torch.utils.data import DataLoader +from torchvision import datasets import matplotlib.pyplot as plt import torch.optim as optim +import argparse -device = "cuda" if torch.cuda.is_available() else "cpu" - -batch_size = 200 -epochs = 10 -lr = 0.001 -nh = 1000 -data = datasets.MNIST( - root='~/.pytorch/MNIST_data/', - download=True - ).data -data = torch.where(data > 1, torch.tensor(1), torch.tensor(0)).to(torch.float32) - -train_loader = DataLoader(dataset=data, batch_size=batch_size, shuffle=True) - -def show_imgs(img_tensors): - fig, axs = plt.subplots(nrows=10, ncols=10) - for i in range(100): - axs[i//10, i%10].imshow(img_tensors[i].view(28, 28), cmap='binary_r') - axs[i//10, i%10].set_axis_off() - plt.show() - - - - +# the restricted boltzmann machine model class RBM(nn.Module): - def __init__(self, n_v, n_h): + def __init__(self, n_v, n_h, k): super().__init__() - self.nv = n_v - self.nh = n_h - self.b = nn.Parameter(torch.normal(0, 1, size=[n_v], dtype=torch.float32, requires_grad=True)) + self.nv = n_v #the number of visible units + self.nh = n_h #the number of hidden units + #weights and biases + self.b = nn.Parameter(torch.normal(0, 1, size=[n_v], dtype=torch.float32, requires_grad=True)) self.c = nn.Parameter(torch.normal(0, 1, size=[n_h], dtype=torch.float32, requires_grad=True)) self.W = nn.Parameter(torch.normal(0, 1, size=(n_v, n_h), dtype=torch.float32, requires_grad=True)) self.sig = nn.Sigmoid() + self.k = k #number of gibbs steps def forward(self, v_d, v_m): with torch.no_grad(): - h_d = self.h_given_v(v_d) - v_m, h_m = self.gibbs_update(v_m, 50) - positive_phase = self.b @ v_d.T + self.c @ h_d.T + ((v_d @ self.W) * h_d).sum(dim=-1) - negative_phase = self.b @ v_m.T + self.c @ h_m.T + ((v_m @ self.W) * h_m).sum(dim=-1) - llh = positive_phase - negative_phase - m = llh.size(0) + h_d = self.h_given_v(v_d) #the calculation of hidden units of the data from the visible units + v_m, h_m = self.gibbs_update(v_m, self.k) # markov chain to get a fair sample from the model + positive_phase = self.b @ v_d.T + self.c @ h_d.T + ((v_d @ self.W) * h_d).sum(dim=-1) #the positive phase of the loglikelyhood + negative_phase = self.b @ v_m.T + self.c @ h_m.T + ((v_m @ self.W) * h_m).sum(dim=-1) #the negative phase of the loglikelyhood + llh = positive_phase - negative_phase + m = llh.size(0) #number of samples llh = -(llh.sum())/m - return llh, v_m + return llh, v_m # return the loss and the visible units sampled from the model in case you want to train with PCD - def gibbs_update(self, v, k): - for i in range(k): + def gibbs_update(self, v, k): #this method is for the markov chain mixing + for _ in range(k): h = self.h_given_v(v) v = self.v_given_h(h) return v, h - def h_given_v(self, v): + def h_given_v(self, v): #this return the conditional probability distibution p(h|v) pmf = self.sig(self.c + v @ self.W) return torch.bernoulli(pmf) - def v_given_h(self, h): + def v_given_h(self, h): #this return the conditional probability distibution p(v|h) pmf = self.sig(self.b + h @ self.W.T) return torch.bernoulli(pmf) - def sample(self, n): + def sample(self, n): #this samples from the model starting from random intialisation and mixing for 100 step with torch.no_grad(): v = torch.bernoulli(torch.rand(n, self.nv)).to(self.W.device) v, _ = self.gibbs_update(v, 100) return v - - -model = RBM(784, nh).to(device) -optimizer = optim.Adam(model.parameters(), lr=lr) -for i in range(epochs): - for batch in train_loader: - v = torch.bernoulli(torch.rand(batch_size,784)).to(device) - b = batch.view(batch_size, -1).to(device) - loss, _ = model(b, v) - optimizer.zero_grad() - loss.backward() - optimizer.step() - if i % 10 == 0: - print(f"step: {i}/{epochs} loss: {loss.item()}") - -mse = nn.MSELoss() -def reconst_err(model): + # the train function implement the naive approach of intializing from a random distribution every gradient step + # it can be easily modifed to be CD by removing v and passing b to the model + # also PCD can be accomplished by moving v out of the loop and renaming the underscore to v + +def train(model, train_loader, optimizer,epochs, batch_size, device): + for i in range(epochs + 1): + for batch in train_loader: + v = torch.bernoulli(torch.rand(batch_size,784)).to(device) + b = batch.view(batch_size, -1).to(device) + loss, _ = model(b, v) + optimizer.zero_grad() + loss.backward() + optimizer.step() + if i % 10 == 0: + print(f"step: {i}/{epochs} loss: {loss.item()}") + + + #the best way to evaluate the model is by looking to the samples created by the model in "model_samples.png" + #but this evaluation is based on the reconstraction error so it can give you a false idea about its capacity +def evaluate(model, train_loader, mse, batch_size, device): with torch.no_grad(): err = 0.0 for batch in train_loader: b = batch.view(batch_size, -1).to(device) v = model(b.to(device), b.to(device))[1] err += mse(b,v) - return err/len(train_loader) + print(f"Reconstraction error: {err/len(train_loader)}") + + +#this method takes image tensors and save them as png +def show_imgs(img_tensors): + fig, axs = plt.subplots(nrows=10, ncols=10) + for i in range(100): + axs[i//10, i%10].imshow(img_tensors[i].view(28, 28), cmap='binary_r') + axs[i//10, i%10].set_axis_off() + plt.savefig('model_samples.png') + plt.show() + + +def main(): + """Parses the arguments for training a RBM.""" + parser = argparse.ArgumentParser() + parser.add_argument( + "--batch", type=int, default=200, help="Batch size for training.") + parser.add_argument( + "--epochs", type=int, default=10, help="Number of epochs for training.") + parser.add_argument( + "--lr", type=float, default=0.001, help="Learning rate for training.") + parser.add_argument( + "--nh", type=int, default=1000, help="Number of hidden units for the RBM.") + parser.add_argument( + "--k", type=int, default=50, help="Number of Gibbs steps during training") + parser.add_argument( + '--save', help='Save the model after training', action='store_true') + + + args = parser.parse_args() + + batch_size = args.batch + epochs = args.epochs + lr = args.lr + nh = args.nh + k = args.k + + device = "cuda" if torch.cuda.is_available() else "cpu" + + +#the data used is mnist + data = datasets.MNIST( + root='~/.pytorch/MNIST_data/', + download=True + ).data + data = torch.where(data > 1, torch.tensor(1), torch.tensor(0)).to(torch.float32) #here i transform it into binary form just 0 and 1 pixels because the model has binary units + + print(f"Training device: {device}") + + train_loader = DataLoader(dataset=data, batch_size=batch_size, shuffle=True) + + model = RBM(784, nh, k).to(device) + optimizer = optim.Adam(model.parameters(), lr=lr) + mse = nn.MSELoss() + + train(model, train_loader, optimizer,epochs, batch_size, device) + evaluate(model, train_loader, mse, batch_size, device) + + if args.save: + torch.save(model.state_dict(), "rbm.pt") + + + + show_imgs(model.sample(100).cpu()) -show_imgs(model.sample(100).cpu()) \ No newline at end of file +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/rbm/requirements.txt b/rbm/requirements.txt new file mode 100644 index 0000000000..cd095e4cd3 --- /dev/null +++ b/rbm/requirements.txt @@ -0,0 +1,3 @@ +torch +torchvision +matplotlib \ No newline at end of file From e0e33d6b13373251a3107dec79991ac963ced22a Mon Sep 17 00:00:00 2001 From: hocine Date: Sat, 30 Dec 2023 21:56:01 +0100 Subject: [PATCH 3/4] added readme --- rbm/README.MD | 18 ++++++++++++++++++ rbm/images/model_samples.png | Bin 0 -> 50670 bytes rbm/main.py | 4 ++-- 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 rbm/images/model_samples.png diff --git a/rbm/README.MD b/rbm/README.MD index f3d99dfac8..4fabbcefb5 100644 --- a/rbm/README.MD +++ b/rbm/README.MD @@ -1,6 +1,24 @@ # Restricted Boltzmann Machine Example +This RBM implementation is based on the [deep learning book](https://www.deeplearningbook.org/) (page 656). The training algorithm used here is the naive MCMC algorithm for maximizing the log-likelihood using gradient ascent (algorithm 18.1, page 608) by burning the Markov chain from a random initialization every gradient step. The code could be modified to train with CD-k (algorithm 18.2, page 610) or PCD-k (algorithm 18.3, page 612). + +## Getting Started + ```bash pip install -r requirements.txt python main.py ``` + +## options: +``` + -h, --help show this help message and exit + --batch BATCH Batch size for training. + --epochs EPOCHS Number of epochs for training. + --lr LR Learning rate for training. + --nh NH Number of hidden units for the RBM. + --k K Number of Gibbs steps during training + --save Save the model after training +``` + +## Models samples +![Sample Image](images/model_samples.png) diff --git a/rbm/images/model_samples.png b/rbm/images/model_samples.png new file mode 100644 index 0000000000000000000000000000000000000000..436b3faf1f10dc32e7b6ab9fe9096e8d9f2f6f17 GIT binary patch literal 50670 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 aZ9-RN