From e19ddcbb292a0591dfe1c31cea311f568fff8f1b Mon Sep 17 00:00:00 2001
From: Aymeric Varasse <aymeric.varasse@cea.fr>
Date: Mon, 22 Apr 2024 18:24:16 +0200
Subject: [PATCH] [exps] Add binary models (sort 0 from others)

---
 .../mnist/nets/binary/FNN_14x14_bin0_s42.onnx | Bin 0 -> 9196 bytes
 .../mnist/nets/binary/FNN_28x28_bin0_s42.onnx | Bin 0 -> 32719 bytes
 examples/mnist/nets/dummy_nn/train.py         | 100 ++++++++++++++----
 3 files changed, 81 insertions(+), 19 deletions(-)
 create mode 100644 examples/mnist/nets/binary/FNN_14x14_bin0_s42.onnx
 create mode 100644 examples/mnist/nets/binary/FNN_28x28_bin0_s42.onnx

diff --git a/examples/mnist/nets/binary/FNN_14x14_bin0_s42.onnx b/examples/mnist/nets/binary/FNN_14x14_bin0_s42.onnx
new file mode 100644
index 0000000000000000000000000000000000000000..a8bdf9d58a5ae4b51d570bb56a876e59787214ee
GIT binary patch
literal 9196
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

literal 0
HcmV?d00001

diff --git a/examples/mnist/nets/binary/FNN_28x28_bin0_s42.onnx b/examples/mnist/nets/binary/FNN_28x28_bin0_s42.onnx
new file mode 100644
index 0000000000000000000000000000000000000000..05840a584c7a64534a6f02d1346d33d6eb2e27d6
GIT binary patch
literal 32719
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

literal 0
HcmV?d00001

diff --git a/examples/mnist/nets/dummy_nn/train.py b/examples/mnist/nets/dummy_nn/train.py
index a612bcf..73b7e9b 100644
--- a/examples/mnist/nets/dummy_nn/train.py
+++ b/examples/mnist/nets/dummy_nn/train.py
@@ -12,11 +12,13 @@ from torch.nn.utils import prune
 from torch.utils.data import DataLoader
 from torchvision import transforms
 
-img_size = 14
+img_size = 28
 
 SEED = 42
 STATE_PATH = f"FNN_{img_size}x{img_size}_s{SEED}.pth"
 ONNX_PATH = f"FNN_{img_size}x{img_size}_s{SEED}.onnx"
+BIN_STATE_PATH = f"FNN_{img_size}x{img_size}_bin0_s{SEED}.pth"
+BIN_ONNX_PATH = f"FNN_{img_size}x{img_size}_bin0_s{SEED}.onnx"
 PRUNED_MODEL_PATH = f"FNN_{img_size}x{img_size}_pruned_s{SEED}.pkl"
 PRUNED_ONNX_PATH = f"FNN_{img_size}x{img_size}_pruned_s{SEED}.onnx"
 FNN_PRE_PATH = f"FNN_28x28_pre_s{SEED}.pth"
@@ -81,14 +83,35 @@ class FNN(nn.Module):
         return x
 
 
+class FNN_bin(nn.Module):
+    def __init__(self):
+        super().__init__()
+        self.flatten = nn.Flatten()
+        self.fc1 = nn.Linear(img_size * img_size, 10)
+        self.fc2 = nn.Linear(10, 10)
+        self.fc3 = nn.Linear(10, 2)
+
+    def forward(self, x):
+        x = self.flatten(x)
+        x = self.fc1(x)
+        x = F.relu(x)
+        x = self.fc2(x)
+        x = F.relu(x)
+        x = self.fc3(x)
+        return x
+
+
 transform = transforms.Compose([transforms.ToTensor(), transforms.Resize([img_size, img_size])])
 
 
-def train(state_dict):
+def train(state_dict, is_bin=False):
     trainset = torchvision.datasets.MNIST(root="./data", train=True, download=True, transform=transform)
     trainloader = DataLoader(trainset, batch_size=batch_size, shuffle=True, num_workers=2)
 
-    model = FNN().to(device)
+    if is_bin:
+        model = FNN_bin().to(device)
+    else:
+        model = FNN().to(device)
     criterion = nn.CrossEntropyLoss()
     optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
 
@@ -96,8 +119,11 @@ def train(state_dict):
         running_loss = 0.0
         for i, data in enumerate(trainloader, 0):
             inputs, labels = data[0].to(device), data[1].to(device)
+            if is_bin:
+                labels = torch.Tensor([1 if item == 0 else 0 for item in labels]).long().to(device)
             optimizer.zero_grad()
             outputs = model(inputs).to(device)
+            outputs = model(inputs).to(device)
             loss = criterion(outputs, labels)
             loss.backward()
             optimizer.step()
@@ -112,7 +138,7 @@ def train(state_dict):
     torch.save(model.state_dict(), state_dict)
 
 
-def train_2_nets(cnn_path, fnn_path):
+def train_2_nets(fnn_pre_path, fnn_post_path):
     trainset = torchvision.datasets.MNIST(root="./data", train=True, download=True, transform=transforms.ToTensor())
     trainloader = DataLoader(trainset, batch_size=batch_size, shuffle=True, num_workers=2)
 
@@ -139,16 +165,25 @@ def train_2_nets(cnn_path, fnn_path):
 
     logger.info("Finished training")
 
-    torch.save(fnn_pre.state_dict(), cnn_path)
-    torch.save(fnn_post.state_dict(), fnn_path)
+    torch.save(fnn_pre.state_dict(), fnn_pre_path)
+    torch.save(fnn_post.state_dict(), fnn_post_path)
 
 
-def test(model_path, is_state_dict=True):
-    classes = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
+def test(model_path, is_state_dict=True, is_bin=False):
+    if is_bin:
+        classes = (0, 1)
+    else:
+        classes = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
     testset = torchvision.datasets.MNIST(root="./data", train=False, download=True, transform=transform)
     testloader = DataLoader(testset, batch_size=batch_size, shuffle=False, num_workers=2)
 
-    if is_state_dict:
+    if is_bin and (not is_state_dict):
+        raise ValueError("Binary model required to be loaded and exported via state dicts.")
+
+    if is_bin:
+        net = FNN_bin().to(device)
+        net.load_state_dict(torch.load(model_path))
+    elif is_state_dict:
         net = FNN().to(device)
         net.load_state_dict(torch.load(model_path))
     else:
@@ -160,12 +195,16 @@ def test(model_path, is_state_dict=True):
     with torch.no_grad():
         for data in testloader:
             images, labels = data[0].to(device), data[1].to(device)
+            if is_bin:
+                labels = torch.Tensor([1 if item == 0 else 0 for item in labels]).long().to(device)
             outputs = net(images)
             _, predicted = torch.max(outputs.data, 1)
             total += labels.size(0)
             correct += (predicted == labels).sum().item()
 
-    if is_state_dict:
+    if is_bin:
+        logger.info(f"Accuracy of the binary network on the 10000 test images: {100 * correct // total} %")
+    elif is_state_dict:
         logger.info(f"Accuracy of the network on the 10000 test images: {100 * correct // total} %")
     else:
         logger.info(f"Accuracy of the pruned network on the 10000 test images: {100 * correct // total} %")
@@ -176,6 +215,8 @@ def test(model_path, is_state_dict=True):
     with torch.no_grad():
         for data in testloader:
             images, labels = data[0].to(device), data[1].to(device)
+            if is_bin:
+                labels = torch.Tensor([1 if item == 0 else 0 for item in labels]).long().to(device)
             outputs = net(images)
             _, predictions = torch.max(outputs, 1)
             for label, prediction in zip(labels, predictions):
@@ -231,8 +272,14 @@ def test_2_nets(fnn_pre_path, fnn_post_path):
         logger.info(f"Accuracy for class: {classname} is {accuracy:.1f} %")
 
 
-def export_model(model_path, onnx_path, is_state_dict=True):
-    if is_state_dict:
+def export_model(model_path, onnx_path, is_state_dict=True, is_bin=False):
+    if is_bin and (not is_state_dict):
+        raise ValueError("Binary model required to be loaded and exported via state dicts.")
+
+    if is_bin:
+        model = FNN_bin().to(device)
+        model.load_state_dict(torch.load(model_path))
+    elif is_state_dict:
         model = FNN().to(device)
         model.load_state_dict(torch.load(model_path))
     else:
@@ -240,12 +287,14 @@ def export_model(model_path, onnx_path, is_state_dict=True):
     x = torch.rand(1, img_size, img_size, device=device)
 
     torch.onnx.export(model=model, args=x, f=onnx_path, export_params=True)
-    if is_state_dict:
+    if is_bin:
+        logger.info("Binary model exported successfully")
+    elif is_state_dict:
         logger.info("Model exported successfully")
     else:
         logger.info("Pruned model exported successfully")
 
-    test_onnx(model_path, onnx_path, is_state_dict)
+    test_onnx(model_path, onnx_path, is_state_dict, is_bin)
 
 
 def export_2_models(fnn_pre_path, fnn_pre_onnx, fnn_post_path, fnn_post_onnx):
@@ -266,8 +315,14 @@ def export_2_models(fnn_pre_path, fnn_pre_onnx, fnn_post_path, fnn_post_onnx):
     test_2_onnx(fnn_pre_path, fnn_pre_onnx, fnn_post_path, fnn_post_onnx)
 
 
-def test_onnx(model_path, onnx_path, is_state_dict=True):
-    if is_state_dict:
+def test_onnx(model_path, onnx_path, is_state_dict=True, is_bin=False):
+    if is_bin and (not is_state_dict):
+        raise ValueError("Binary model required to be loaded and exported via state dicts.")
+
+    if is_bin:
+        model = FNN_bin().to(device)
+        model.load_state_dict(torch.load(model_path))
+    elif is_state_dict:
         model = FNN().to(device)
         model.load_state_dict(torch.load(model_path))
     else:
@@ -290,7 +345,9 @@ def test_onnx(model_path, onnx_path, is_state_dict=True):
 
         np.testing.assert_allclose(to_numpy(torch_out), ort_outs[0], rtol=1e-03, atol=1e-05)
 
-    if is_state_dict:
+    if is_bin:
+        logger.info("Exported binary model has been tested with ONNXRuntime, and the result looks good!")
+    elif is_state_dict:
         logger.info("Exported model has been tested with ONNXRuntime, and the result looks good!")
     else:
         logger.info("Exported pruned model has been tested with ONNXRuntime, and the result looks good!")
@@ -374,8 +431,9 @@ def build_pruned_model(state_dict, pruned_model_path):
 
 
 if __name__ == "__main__":
-    logger.info("Building, training and exporting to ONNX a simple FNN and a pruned FNN.")
+    # TODO: Add an argument parser?
 
+    logger.info("Building, training and exporting to ONNX a simple FNN and a pruned FNN.")
     train(STATE_PATH)
     test(STATE_PATH)
     export_model(STATE_PATH, ONNX_PATH)
@@ -384,7 +442,11 @@ if __name__ == "__main__":
     export_model(PRUNED_MODEL_PATH, PRUNED_ONNX_PATH, is_state_dict=False)
 
     logger.info("Building, training and exporting to ONNX two FNNs that are to be used successively.")
-
     train_2_nets(FNN_PRE_PATH, FNN_POST_PATH)
     test_2_nets(FNN_PRE_PATH, FNN_POST_PATH)
     export_2_models(FNN_PRE_PATH, FNN_PRE_ONNX_PATH, FNN_POST_PATH, FNN_POST_ONNX_PATH)
+
+    logger.info("Building, training and exporting to ONNX a binary FNN.")
+    train(BIN_STATE_PATH, is_bin=True)
+    test(BIN_STATE_PATH, is_bin=True)
+    export_model(BIN_STATE_PATH, BIN_ONNX_PATH, is_bin=True)
-- 
GitLab