diff --git a/DataLoader/__pycache__/dataLoaders.cpython-37.pyc b/DataLoader/__pycache__/dataLoaders.cpython-37.pyc
index 687855097eb37774887b3094c913583eaf4c7a40..a157807a2949f60f288ca58c2e5aa8c4ee494c4b 100644
Binary files a/DataLoader/__pycache__/dataLoaders.cpython-37.pyc and b/DataLoader/__pycache__/dataLoaders.cpython-37.pyc differ
diff --git a/DataLoader/__pycache__/prepare_omniglot.cpython-37.pyc b/DataLoader/__pycache__/prepare_omniglot.cpython-37.pyc
index 5ab3ceed4c1765b13a7bfa9ff5e3f682db4ec8f5..1e0ce6994f013d6d9c7518ead93e637584903f10 100644
Binary files a/DataLoader/__pycache__/prepare_omniglot.cpython-37.pyc and b/DataLoader/__pycache__/prepare_omniglot.cpython-37.pyc differ
diff --git a/__pycache__/config.cpython-37.pyc b/__pycache__/config.cpython-37.pyc
index 5ff4ed0cc20553bb1788cfeb55a92e74ded4b14b..11137e9cb7753a1e03a1434e187f84782695efda 100644
Binary files a/__pycache__/config.cpython-37.pyc and b/__pycache__/config.cpython-37.pyc differ
diff --git a/distributions/__pycache__/__init__.cpython-37.pyc b/distributions/__pycache__/__init__.cpython-37.pyc
index 27ec2ae3785d848500be85ebc2678d3ea2f64166..dd77b8adb64a7e7909172e7ee23747523a813c63 100644
Binary files a/distributions/__pycache__/__init__.cpython-37.pyc and b/distributions/__pycache__/__init__.cpython-37.pyc differ
diff --git a/distributions/__pycache__/bernoulli.cpython-37.pyc b/distributions/__pycache__/bernoulli.cpython-37.pyc
index 2af4c4cd7063490515d35237f7b9d44e2a42defa..b44b6a3198feaf515c55de57aa1fc8d829953305 100644
Binary files a/distributions/__pycache__/bernoulli.cpython-37.pyc and b/distributions/__pycache__/bernoulli.cpython-37.pyc differ
diff --git a/distributions/__pycache__/distribution.cpython-37.pyc b/distributions/__pycache__/distribution.cpython-37.pyc
index 55ebba7cc9adff823a18adb7f874a2315ac51ff0..016b4e9bc5306ab9fb77b21061944507b6a0603e 100644
Binary files a/distributions/__pycache__/distribution.cpython-37.pyc and b/distributions/__pycache__/distribution.cpython-37.pyc differ
diff --git a/distributions/__pycache__/round.cpython-37.pyc b/distributions/__pycache__/round.cpython-37.pyc
index 7477e9c1908f08f7e4aadfe67dcb88f4be866d78..a0e2377922efe70066949586f1eddfafd92d6ff5 100644
Binary files a/distributions/__pycache__/round.cpython-37.pyc and b/distributions/__pycache__/round.cpython-37.pyc differ
diff --git a/distributions/__pycache__/utils.cpython-37.pyc b/distributions/__pycache__/utils.cpython-37.pyc
index bd729eb87ccce6bd10c7763b2d6d91ba13b628e8..622ebab5cd8b19839ae07a9681a67137764e69d2 100644
Binary files a/distributions/__pycache__/utils.cpython-37.pyc and b/distributions/__pycache__/utils.cpython-37.pyc differ
diff --git a/experiments/omniglot_binary_classif.py b/experiments/omniglot_binary_classif.py
index d5b4daa6067308c5fadc082c188644399b4bc961..13978419ced66d89aa120b12fbe0e3d90354c0b2 100644
--- a/experiments/omniglot_binary_classif.py
+++ b/experiments/omniglot_binary_classif.py
@@ -13,24 +13,24 @@ batch_size_test = 64
 train_loader, valid_loader, test_loader = get_omniglot_dataloaders_classification(batch_size_train, batch_size_test)
 
 # parameters default values
-epochs = 100
+epochs = 50
 lr = 1e-3
 momentum = 0.9
 log_interval = 10  # how many batches to wait before logging training status
 criterion = F.nll_loss
 
 # parameters model to load no Binary model
-binary = False
-model_no_binary, name_model = get_my_model_Omniglot(binary)
-print(name_model)
+#binary = False
+#model_no_binary, name_model = get_my_model_Omniglot(binary)
+#print(name_model)
 
-path_model_checkpoint_no_binary = 'trained_models/Omniglot_classif/No_binary_models/'
-path_save_plot_no_binary = 'results/Omniglot_results/plot_acc_loss/Omniglot_classif/'
+#path_model_checkpoint_no_binary = 'trained_models/Omniglot_classif/No_binary_models/'
+#path_save_plot_no_binary = 'results/Omniglot_results/plot_acc_loss/Omniglot_classif/'
 
-print('Begin running No Binary model')
-run(model_no_binary, path_model_checkpoint_no_binary, path_save_plot_no_binary, name_model, train_loader, valid_loader,
-    epochs, lr, momentum, criterion, log_interval)
-print('End running No Binary model')
+#print('Begin running No Binary model')
+#run(model_no_binary, path_model_checkpoint_no_binary, path_save_plot_no_binary, name_model, train_loader, valid_loader,
+#    epochs, lr, momentum, criterion, log_interval)
+#print('End running No Binary model')
 
 # parameters model to load no Binary model
 binary = True
diff --git a/results/Omniglot_results/plot_acc_loss/Omniglot_classif/Omniglot_classif_NonBinaryNet_acc.png b/results/Omniglot_results/plot_acc_loss/Omniglot_classif/Omniglot_classif_NonBinaryNet_acc.png
new file mode 100644
index 0000000000000000000000000000000000000000..1b6b61ebd7e5342302ee5661cbbb15e5fc875c19
Binary files /dev/null and b/results/Omniglot_results/plot_acc_loss/Omniglot_classif/Omniglot_classif_NonBinaryNet_acc.png differ
diff --git a/results/Omniglot_results/plot_acc_loss/Omniglot_classif/Omniglot_classif_NonBinaryNet_loss.png b/results/Omniglot_results/plot_acc_loss/Omniglot_classif/Omniglot_classif_NonBinaryNet_loss.png
new file mode 100644
index 0000000000000000000000000000000000000000..ec402bcf6e5a957388ee600b61eb5b34cea97c99
Binary files /dev/null and b/results/Omniglot_results/plot_acc_loss/Omniglot_classif/Omniglot_classif_NonBinaryNet_loss.png differ
diff --git a/results/Omniglot_results/plot_acc_loss/Omniglot_classif/Omniglot_classif_Stochastic_ST_first_conv_binary_acc.png b/results/Omniglot_results/plot_acc_loss/Omniglot_classif/Omniglot_classif_Stochastic_ST_first_conv_binary_acc.png
new file mode 100644
index 0000000000000000000000000000000000000000..11ac8f192b3acd3d9fe186d1d2f5fe0f7b588393
Binary files /dev/null and b/results/Omniglot_results/plot_acc_loss/Omniglot_classif/Omniglot_classif_Stochastic_ST_first_conv_binary_acc.png differ
diff --git a/results/Omniglot_results/plot_acc_loss/Omniglot_classif/Omniglot_classif_Stochastic_ST_first_conv_binary_loss.png b/results/Omniglot_results/plot_acc_loss/Omniglot_classif/Omniglot_classif_Stochastic_ST_first_conv_binary_loss.png
new file mode 100644
index 0000000000000000000000000000000000000000..0c330aeaf814855665b0622a929d2de03c27aaef
Binary files /dev/null and b/results/Omniglot_results/plot_acc_loss/Omniglot_classif/Omniglot_classif_Stochastic_ST_first_conv_binary_loss.png differ
diff --git a/utils/.models.py.swp b/utils/.models.py.swp
new file mode 100644
index 0000000000000000000000000000000000000000..16b26aed3c8c6a6c945ed9ee305c6a750207acd1
Binary files /dev/null and b/utils/.models.py.swp differ
diff --git a/utils/__pycache__/activations.cpython-37.pyc b/utils/__pycache__/activations.cpython-37.pyc
index 670d2296fd8b6aa6189b1786b4e23cb4d43ec214..7ce30f8a9fb5541dd2e0ed3962fe9093f8e729fc 100644
Binary files a/utils/__pycache__/activations.cpython-37.pyc and b/utils/__pycache__/activations.cpython-37.pyc differ
diff --git a/utils/__pycache__/callback.cpython-37.pyc b/utils/__pycache__/callback.cpython-37.pyc
index 61a2d0db358a5fb165b529e25643c292d11f0258..5010144e02de9a73e0be26bf79506af3e3022687 100644
Binary files a/utils/__pycache__/callback.cpython-37.pyc and b/utils/__pycache__/callback.cpython-37.pyc differ
diff --git a/utils/__pycache__/core.cpython-37.pyc b/utils/__pycache__/core.cpython-37.pyc
index 36483e0770d456968f1fa2e495cf6d896ce26d83..7049d3981ebc3a1506b94db6b7b5b6273dd9f122 100644
Binary files a/utils/__pycache__/core.cpython-37.pyc and b/utils/__pycache__/core.cpython-37.pyc differ
diff --git a/utils/__pycache__/functions.cpython-37.pyc b/utils/__pycache__/functions.cpython-37.pyc
index 2759c6a05ad727b472714c3f85ab7b27d6be29f5..4cce7b5e69216acde994f9af4fd5a32f51e04848 100644
Binary files a/utils/__pycache__/functions.cpython-37.pyc and b/utils/__pycache__/functions.cpython-37.pyc differ
diff --git a/utils/__pycache__/models.cpython-37.pyc b/utils/__pycache__/models.cpython-37.pyc
index 4b68076f78507950283496354beae94ea04ab7c9..04934ea2e22cf929772ae9e7c4c2caaf0dc96f79 100644
Binary files a/utils/__pycache__/models.cpython-37.pyc and b/utils/__pycache__/models.cpython-37.pyc differ
diff --git a/utils/__pycache__/training.cpython-37.pyc b/utils/__pycache__/training.cpython-37.pyc
index baf617dfd8ed59172aa55b5699e86d59c21fe739..204c502a497bac6fb09886f199654d0d20b93035 100644
Binary files a/utils/__pycache__/training.cpython-37.pyc and b/utils/__pycache__/training.cpython-37.pyc differ
diff --git a/utils/models.py b/utils/models.py
index 6758a15c54a2873e0a165419f708203b954892a9..7a14a98cdc920c4e3ed3b0964d02d0b0e5b81db1 100644
--- a/utils/models.py
+++ b/utils/models.py
@@ -211,48 +211,53 @@ class NoBinaryNetOmniglotClassification(Net):
     def __init__(self):
         super(NoBinaryNetOmniglotClassification, self).__init__()
 
-        self.layer1 = nn.Conv2d(1, 128, kernel_size=3, padding=1, stride=2)
-        self.batchNorm1 = nn.BatchNorm2d(128)
-        self.dropout1 = nn.Dropout(0.5) #50 % probability 
-        # self.maxPool1 = nn.MaxPool2d(kernel_size=2, stride=2)
+        self.layer1 = nn.Conv2d(1, 64, kernel_size=3, padding=1, stride=1)
+        self.batchNorm1 = nn.BatchNorm2d(64)
+        # self.dropout1 = nn.Dropout(0.5) #50 % probability 
+        self.maxPool1 = nn.MaxPool2d(kernel_size=2, stride=2)
         self.act_layer1 = nn.ReLU()
-        self.layer2 = nn.Conv2d(128, 256, kernel_size=3, padding=1, stride=2)
-        self.batchNorm2 = nn.BatchNorm2d(256)
-        self.dropout2 = nn.Dropout(0.5)
-        # self.maxPool2 = nn.MaxPool2d(kernel_size=2, stride=2)            
+        self.layer2 = nn.Conv2d(64, 128, kernel_size=3, padding=1, stride=1)
+        self.batchNorm2 = nn.BatchNorm2d(128)
+        # self.dropout2 = nn.Dropout(0.5)
+        self.maxPool2 = nn.MaxPool2d(kernel_size=2, stride=2)            
         self.act_layer2 = nn.ReLU()
-        self.layer3 = nn.Conv2d(256, 256, kernel_size=3, padding=1, stride=2)
+        self.layer3 = nn.Conv2d(128, 256, kernel_size=3, padding=1, stride=1)
         self.batchNorm3 = nn.BatchNorm2d(256)
-        self.dropout3 = nn.Dropout(0.5)
-        # self.maxPool3 = nn.MaxPool2d(kernel_size=2, stride=2)  
+        # self.dropout3 = nn.Dropout(0.5)
+        self.maxPool3 = nn.MaxPool2d(kernel_size=2, stride=2)  
         self.act_layer3 = nn.ReLU()
-        self.layer4 = nn.Conv2d(256, 256, kernel_size=3, padding=1, stride=2)
-        self.batchNorm4 = nn.BatchNorm2d(256)
-        self.dropout4 = nn.Dropout(0.5)
+        self.layer4 = nn.Conv2d(256, 512, kernel_size=3, padding=1, stride=1)
+        self.batchNorm4 = nn.BatchNorm2d(512)
+        # self.dropout4 = nn.Dropout(0.5)
+        self.maxPool4 = nn.MaxPool2d(kernel_size=2, stride=2)
         self.act_layer4 = nn.ReLU()
-        self.layer5 = nn.Conv2d(256, 256, kernel_size=3, padding=1, stride=2)
-        self.batchNorm5 = nn.BatchNorm2d(256)
-        # self.maxPool4 = nn.MaxPool2d(kernel_size=2, stride=2)              
+        self.layer5 = nn.Conv2d(512, 512, kernel_size=3, padding=1, stride=1)
+        self.batchNorm5 = nn.BatchNorm2d(512)
+        self.maxPool5 = nn.MaxPool2d(kernel_size=2, stride=2)
         self.act_layer5 = nn.ReLU()
-        self.fc = nn.Linear(3 * 3 * 256, 1623)
+        self.fc1 = nn.Linear(3 * 3 * 512, 4096)
+        self.act_fc1 = nn.ReLU()
+        self.dropout1 = nn.Dropout(0.5)
+        self.fc2 = nn.Linear(4096, 1623)
 
     def forward(self, input):
         x = input
         slope = 1.0
-        """
+        """maxPool1 
         x_layer1 = self.act_layer1(self.maxPool1(self.batchNorm1(self.layer1(x) * slope)))
         x_layer2 = self.act_layer2(self.maxPool2(self.batchNorm2(self.layer2(x_layer1))))
         x_layer3 = self.act_layer3(self.maxPool3(self.batchNorm3(self.layer3(x_layer2))))
         x_layer4 = self.act_layer4(self.maxPool4(self.batchNorm4(self.layer4(x_layer3))))
         """
-        x_layer1 = self.act_layer1(self.dropout1(self.batchNorm1(self.layer1(x) * slope)))
-        x_layer2 = self.act_layer2(self.dropout2(self.batchNorm2(self.layer2(x_layer1))))
-        x_layer3 = self.act_layer3(self.dropout3(self.batchNorm3(self.layer3(x_layer2))))
-        x_layer4 = self.act_layer4(self.dropout4(self.batchNorm4(self.layer4(x_layer3))))
-        x_layer5 = self.act_layer5(self.batchNorm5(self.layer5(x_layer4)))
+        x_layer1 = self.act_layer1(self.maxPool1(self.batchNorm1(self.layer1(x) * slope)))
+        x_layer2 = self.act_layer2(self.maxPool2(self.batchNorm2(self.layer2(x_layer1))))
+        x_layer3 = self.act_layer3(self.maxPool3(self.batchNorm3(self.layer3(x_layer2))))
+        x_layer4 = self.act_layer4(self.maxPool4(self.batchNorm4(self.layer4(x_layer3))))
+        x_layer5 = self.act_layer5(self.maxPool5(self.batchNorm5(self.layer5(x_layer4))))
         x_layer5 = x_layer5.view(x_layer5.size(0), -1)
-        x_fc = self.fc(x_layer5)
-        x_out = F.log_softmax(x_fc, dim=1)
+        x_fc1 = self.dropout1(self.act_fc1(self.fc1(x_layer5)))
+        x_fc2 = self.fc2(x_fc1)
+        x_out = F.log_softmax(x_fc2, dim=1)
         return x_out
 
 
@@ -274,10 +279,10 @@ class BinaryNetOmniglotClassification(Net):
         self.third_conv_layer = third_conv_layer
         self.fourth_conv_layer = fourth_conv_layer
 
-        self.layer1 = nn.Conv2d(1, 128, kernel_size=3, padding=1, stride=2)
-        self.batchNorm1 = nn.BatchNorm2d(128)
-        self.dropout1 = nn.Dropout(0.5)
-        # self.maxPool1 = nn.MaxPool2d(kernel_size=2, stride=2)
+        self.layer1 = nn.Conv2d(1, 64, kernel_size=3, padding=1, stride=1)
+        self.batchNorm1 = nn.BatchNorm2d(64)
+        # self.dropout1 = nn.Dropout(0.5)
+        self.maxPool1 = nn.MaxPool2d(kernel_size=2, stride=2)
         if self.first_conv_layer:
             if self.mode == 'Deterministic':
                 self.act_layer1 = DeterministicBinaryActivation(estimator=estimator)
@@ -285,10 +290,10 @@ class BinaryNetOmniglotClassification(Net):
                 self.act_layer1 = StochasticBinaryActivation(estimator=estimator)
         else:
             self.act_layer1 = nn.ReLU()
-        self.layer2 = nn.Conv2d(128, 256, kernel_size=3, padding=1, stride=2)
-        self.batchNorm2 = nn.BatchNorm2d(256)
-        self.dropout2 = nn.Dropout(0.5)
-        # self.maxPool2 = nn.MaxPool2d(kernel_size=2, stride=2)
+        self.layer2 = nn.Conv2d(64, 128, kernel_size=3, padding=1, stride=1)
+        self.batchNorm2 = nn.BatchNorm2d(128)
+        # self.dropout2 = nn.Dropout(0.5)
+        self.maxPool2 = nn.MaxPool2d(kernel_size=2, stride=2)
         if self.second_conv_layer:
             if self.mode == 'Deterministic':
                 self.act_layer2 = DeterministicBinaryActivation(estimator=estimator)
@@ -296,10 +301,10 @@ class BinaryNetOmniglotClassification(Net):
                 self.act_layer2 = StochasticBinaryActivation(estimator=estimator)
         else:
             self.act_layer2 = nn.ReLU()
-        self.layer3 = nn.Conv2d(256, 256, kernel_size=3, padding=1, stride=2)
+        self.layer3 = nn.Conv2d(128, 256, kernel_size=3, padding=1, stride=1)
         self.batchNorm3 = nn.BatchNorm2d(256)
-        self.dropout3 = nn.Dropout(0.5)
-        # self.maxPool3 = nn.MaxPool2d(kernel_size=2, stride=2) 
+        # self.dropout3 = nn.Dropout(0.5)
+        self.maxPool3 = nn.MaxPool2d(kernel_size=2, stride=2) 
         if self.third_conv_layer:
             if self.mode == 'Deterministic':
                 self.act_layer3 = DeterministicBinaryActivation(estimator=estimator)
@@ -307,10 +312,10 @@ class BinaryNetOmniglotClassification(Net):
                 self.act_layer3 = StochasticBinaryActivation(estimator=estimator)
         else:
             self.act_layer3 = nn.ReLU()
-        self.layer4 = nn.Conv2d(256, 256, kernel_size=3, padding=1, stride=2)
-        self.batchNorm4 = nn.BatchNorm2d(256)
-        self.dropout4 = nn.Dropout(0.5)
-        # self.maxPool4 = nn.MaxPool2d(kernel_size=2, stride=2)   
+        self.layer4 = nn.Conv2d(256, 512, kernel_size=3, padding=1, stride=1)
+        self.batchNorm4 = nn.BatchNorm2d(512)
+        # self.dropout4 = nn.Dropout(0.5)
+        self.maxPool4 = nn.MaxPool2d(kernel_size=2, stride=2)   
         if self.fourth_conv_layer:
             if self.mode == 'Deterministic':
                 self.act_layer4 = DeterministicBinaryActivation(estimator=estimator)
@@ -318,10 +323,15 @@ class BinaryNetOmniglotClassification(Net):
                 self.act_layer4 = StochasticBinaryActivation(estimator=estimator)
         else:
             self.act_layer4 = nn.ReLU()
-        self.layer5 = nn.Conv2d(256, 256, kernel_size=3, padding=1, stride=2)
-        self.batchNorm5 = nn.BatchNorm2d(256)         
+        self.layer5 = nn.Conv2d(512, 512, kernel_size=3, padding=1, stride=1)
+        self.batchNorm5 = nn.BatchNorm2d(512)        
+        self.maxPool5 = nn.MaxPool2d(kernel_size=2, stride=2) 
         self.act_layer5 = nn.ReLU()
-        self.fc = nn.Linear(3 * 3 * 256, 1623)
+        self.fc1 = nn.Linear(3 * 3 * 512, 4096)
+        self.act_fc1 = nn.ReLU()
+        self.dropout1 = nn.Dropout(0.5)
+        self.fc2 = nn.Linear(4096, 1623)
+
 
     def forward(self, input):
         x = input
@@ -345,25 +355,26 @@ class BinaryNetOmniglotClassification(Net):
             x_layer4 = self.act_layer4(self.maxPool4(self.batchNorm4(self.layer4(x_layer3) * slope)))
         """
         if self.first_conv_layer:
-            x_layer1 = self.act_layer1(((self.dropout1(self.batchNorm1(self.layer1(x)))), slope))
+            x_layer1 = self.act_layer1(((self.maxPool1(self.batchNorm1(self.layer1(x)))), slope))
         else:
-            x_layer1 = self.act_layer1(self.dropout1(self.batchNorm1(self.layer1(x) * slope)))
+            x_layer1 = self.act_layer1(self.maxPool1(self.batchNorm1(self.layer1(x) * slope)))
         if self.second_conv_layer:
-            x_layer2 = self.act_layer2(((self.dropout2(self.batchNorm2(self.layer2(x_layer1)))), slope))
+            x_layer2 = self.act_layer2(((self.maxPool2(self.batchNorm2(self.layer2(x_layer1)))), slope))
         else:
-            x_layer2 = self.act_layer2(self.dropout2(self.batchNorm2(self.layer2(x_layer1) * slope)))
+            x_layer2 = self.act_layer2(self.maxPool2(self.batchNorm2(self.layer2(x_layer1) * slope)))
         if self.third_conv_layer:
-            x_layer3 = self.act_layer3(((self.dropout3(self.batchNorm3(self.layer3(x_layer2)))), slope))
+            x_layer3 = self.act_layer3(((self.maxPool3(self.batchNorm3(self.layer3(x_layer2)))), slope))
         else:
-            x_layer3 = self.act_layer3(self.dropout3(self.batchNorm3(self.layer3(x_layer2) * slope)))
+            x_layer3 = self.act_layer3(self.maxPool3(self.batchNorm3(self.layer3(x_layer2) * slope)))
         if self.fourth_conv_layer:
-            x_layer4 = self.act_layer4(((self.dropout4(self.batchNorm4(self.layer4(x_layer3)))), slope))
+            x_layer4 = self.act_layer4(((self.maxPool4(self.batchNorm4(self.layer4(x_layer3)))), slope))
         else:
-            x_layer4 = self.act_layer4(self.dropout4(self.batchNorm4(self.layer4(x_layer3) * slope)))
-        x_layer5 = self.act_layer5(self.batchNorm5(self.layer5(x_layer4) * slope))
+            x_layer4 = self.act_layer4(self.maxPool4(self.batchNorm4(self.layer4(x_layer3) * slope)))
+        x_layer5 = self.act_layer5(self.maxPool5(self.batchNorm5(self.layer5(x_layer4))))
         x_layer5 = x_layer5.view(x_layer5.size(0), -1)
-        x_fc = self.fc(x_layer5)
-        x_out = F.log_softmax(x_fc, dim=1)
+        x_fc1 = self.dropout1(self.act_fc1(self.fc1(x_layer5)))
+        x_fc2 = self.fc2(x_fc1)
+        x_out = F.log_softmax(x_fc2, dim=1)
         return x_out