diff --git a/README.md b/README.md index ea03ed9..f75b235 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,10 @@ The pytorch implementation is also very effieicent and the whole model takes onl #### Update History:
+-- 2023 May 13:
+  -- Add support for torch hub.
 -- 2023 Apr 14:
-  -- update benchmark results
+  -- update benchmark results.
 -- 2023 Apr 13:
   -- new weights for the removed paddings for 1x1 conv layers.
   -- some minor fixes
@@ -147,6 +149,71 @@ For all benchmark results [look here](https://github.com/Coderx7/SimpleNet_Pytor
 #### Models and logs  
 -- refer to each dataset directory in the repository for further information on how to access models.
 
+### How to use
+You can either download the [simplenet.py model](./imagenet/simplenet.py) and use it directly in your projects 
+or you can use torch hub.  
+
+Using torch hub you can do something like this:  
+```python
+import torch
+# use the latest master
+model = torch.hub.load("coderx7/simplenet_pytorch", "simplenetv1_5m_m1", pretrained=True)
+# or any of these variants at the moment
+# model = torch.hub.load("coderx7/simplenet_pytorch:v1.0.0", "simplenetv1_5m_m2", pretrained=True)
+# model = torch.hub.load("coderx7/simplenet_pytorch:v1.0.0", "simplenetv1_9m_m1", pretrained=True)
+# model = torch.hub.load("coderx7/simplenet_pytorch:v1.0.0", "simplenetv1_9m_m2", pretrained=True)
+# model = torch.hub.load("coderx7/simplenet_pytorch:v1.0.0", "simplenetv1_small_m1_05", pretrained=True)
+# model = torch.hub.load("coderx7/simplenet_pytorch:v1.0.0", "simplenetv1_small_m2_05", pretrained=True)
+# model = torch.hub.load("coderx7/simplenet_pytorch:v1.0.0", "simplenetv1_small_m1_075", pretrained=True)
+# model = torch.hub.load("coderx7/simplenet_pytorch:v1.0.0", "simplenetv1_small_m2_075", pretrained=True)
+model.eval()
+
+# Download an example image from the pytorch website
+import urllib
+url, filename = ("https://github.com/pytorch/hub/raw/master/images/dog.jpg", "dog.jpg")
+try: urllib.URLopener().retrieve(url, filename)
+except: urllib.request.urlretrieve(url, filename)
+
+# sample execution (requires torchvision)
+from PIL import Image
+from torchvision import transforms
+input_image = Image.open(filename)
+preprocess = transforms.Compose([
+    transforms.Resize(256),
+    transforms.CenterCrop(224),
+    transforms.ToTensor(),
+    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
+])
+input_tensor = preprocess(input_image)
+input_batch = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model
+
+# move the input and model to GPU for speed if available
+if torch.cuda.is_available():
+    input_batch = input_batch.to('cuda')
+    model.to('cuda')
+
+with torch.no_grad():
+    output = model(input_batch)
+# Tensor of shape 1000, with confidence scores over Imagenet's 1000 classes
+print(output[0])
+# The output has unnormalized scores. To get probabilities, you can run a softmax on it.
+probabilities = torch.nn.functional.softmax(output[0], dim=0)
+print(probabilities)
+
+# Download ImageNet labels
+!wget https://raw.githubusercontent.com/pytorch/hub/master/imagenet_classes.txt
+
+# Read the categories
+with open("imagenet_classes.txt", "r") as f:
+    categories = [s.strip() for s in f.readlines()]
+# Show top categories per image
+top5_prob, top5_catid = torch.topk(probabilities, 5)
+for i in range(top5_prob.size(0)):
+    print(categories[top5_catid[i]], top5_prob[i].item())
+```
+
+or you can run the demo online from huggingface simplenetspace: https://huggingface.co/spaces/coderx7/simplenet 
+
 
 ## Citation
 If you find SimpleNet useful in your research, please consider citing:
diff --git a/cifar/README.md b/cifar/README.md
index 563a9e8..0649e1a 100644
--- a/cifar/README.md
+++ b/cifar/README.md
@@ -50,9 +50,8 @@ Simply initiate the training like :
 `python3 main.py ./data/cifar.python --dataset cifar10 --arch simplenet_cifar_5m --save_path ./snapshots/simplenet --epochs 540 --batch_size 100 --workers 2`
 
 
-Note 1: the initial learning rate, and optimization policy is hard coded just like caffe.  
-Note 2: for testing the cifar10/100 weights located in the repository, use the `simplenet_cifar_5m_extra_pool` model instead. see [issue #5](https://github.com/Coderx7/SimpleNet_Pytorch/issues/5) for more information. 
-
+Note 1: The initial learning rate, and optimization policy is hard coded just like caffe.  
+Note 2: For testing the cifar10/100 weights located in the repository, use the `simplenet_cifar_5m_extra_pool` model instead. see [issue #5](https://github.com/Coderx7/SimpleNet_Pytorch/issues/5) and [Error loading checkpoint#7](https://github.com/Coderx7/SimpleNet_Pytorch/issues/7#issuecomment-1932491193) for more information.
 
 ## Citation
 If you find SimpleNet useful in your research, please consider citing:
diff --git a/cifar/models/simplenet.py b/cifar/models/simplenet.py
index 9d9acbf..b808219 100644
--- a/cifar/models/simplenet.py
+++ b/cifar/models/simplenet.py
@@ -297,6 +297,7 @@ def _make_layers(self, scale: float):
             # check to convert any possible integer value to its decimal counterpart.
             custom_dropout = None if custom_dropout is None else float(custom_dropout)
             kernel_size = 3
+            padding = 1
             if layer_type == ['k1']:
                 kernel_size = 1
                 padding = 0 
@@ -404,7 +405,7 @@ def simplenet(pretrained: bool = False, **kwargs: Any) -> SimpleNet:
     return _gen_simplenet(model_variant, num_classes, in_chans, scale, network_idx, mode, pretrained, drop_rates)
 
 
-def remove_network_settings(kwargs: Dict[str, Any]) -> Dict[str, Any]:
+def _remove_network_settings(kwargs: Dict[str, Any]) -> Dict[str, Any]:
     """Removes network related settings passed in kwargs for predefined network configruations below
 
     Returns:
@@ -420,7 +421,7 @@ def simplenet_cifar_310k(pretrained: bool = False, **kwargs: Any) -> SimpleNet:
     that were used in the paper 
     """
     model_variant = "simplenet_cifar_310k"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, network_idx=2, mode=0, pretrained=pretrained, **model_args)
 
 
@@ -429,7 +430,7 @@ def simplenet_cifar_460k(pretrained: bool = False, **kwargs: Any) -> SimpleNet:
     that were used in the paper 
     """
     model_variant = "simplenet_cifar_460k"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, network_idx=3, mode=0, pretrained=pretrained, **model_args)
 
 
@@ -437,7 +438,7 @@ def simplenet_cifar_5m(pretrained: bool = False, **kwargs: Any) -> SimpleNet:
     """The original implementation of simplenet trained on cifar10/100 in caffe.
     """
     model_variant = "simplenet_cifar_5m"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, network_idx=4, mode=0, pretrained=pretrained, **model_args)
 
 
@@ -447,7 +448,7 @@ def simplenet_cifar_5m_extra_pool(pretrained: bool = False, **kwargs: Any) -> Si
     this is just here to be able to load the weights that were trained using this variation still available on the repository. 
     """
     model_variant = "simplenet_cifar_5m_extra_pool"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, network_idx=5, mode=0, pretrained=pretrained, **model_args)
 
 
@@ -463,7 +464,7 @@ def simplenetv1_small_m1_05(pretrained: bool = False, **kwargs: Any) -> SimpleNe
         SimpleNet: a SimpleNet model instance is returned upon successful instantiation. 
     """
     model_variant = "simplenetv1_small_m1_05"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, scale=0.5, network_idx=0, mode=1, pretrained=pretrained, **model_args)
 
 
@@ -478,7 +479,7 @@ def simplenetv1_small_m2_05(pretrained: bool = False, **kwargs: Any) -> SimpleNe
         SimpleNet: a SimpleNet model instance is returned upon successful instantiation. 
     """
     model_variant = "simplenetv1_small_m2_05"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, scale=0.5, network_idx=0, mode=2, pretrained=pretrained, **model_args)
 
 
@@ -493,7 +494,7 @@ def simplenetv1_small_m1_075(pretrained: bool = False, **kwargs: Any) -> SimpleN
         SimpleNet: a SimpleNet model instance is returned upon successful instantiation. 
     """
     model_variant = "simplenetv1_small_m1_075"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, scale=0.75, network_idx=0, mode=1, pretrained=pretrained, **model_args)
 
 
@@ -508,7 +509,7 @@ def simplenetv1_small_m2_075(pretrained: bool = False, **kwargs: Any) -> SimpleN
         SimpleNet: a SimpleNet model instance is returned upon successful instantiation. 
     """
     model_variant = "simplenetv1_small_m2_075"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, scale=0.75, network_idx=0, mode=2, pretrained=pretrained, **model_args)
 
 
@@ -523,7 +524,7 @@ def simplenetv1_5m_m1(pretrained: bool = False, **kwargs: Any) -> SimpleNet:
         SimpleNet: a SimpleNet model instance is returned upon successful instantiation. 
     """
     model_variant = "simplenetv1_5m_m1"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, scale=1.0, network_idx=0, mode=1, pretrained=pretrained, **model_args)
 
 
@@ -538,7 +539,7 @@ def simplenetv1_5m_m2(pretrained: bool = False, **kwargs: Any) -> SimpleNet:
         SimpleNet: a SimpleNet model instance is returned upon successful instantiation. 
     """
     model_variant = "simplenetv1_5m_m2"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, scale=1.0, network_idx=0, mode=2, pretrained=pretrained, **model_args)
 
 
@@ -553,7 +554,7 @@ def simplenetv1_9m_m1(pretrained: bool = False, **kwargs: Any) -> SimpleNet:
         SimpleNet: a SimpleNet model instance is returned upon successful instantiation. 
     """
     model_variant = "simplenetv1_9m_m1"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, scale=1.0, network_idx=1, mode=1, pretrained=pretrained, **model_args)
 
 
@@ -568,7 +569,7 @@ def simplenetv1_9m_m2(pretrained: bool = False, **kwargs: Any) -> SimpleNet:
         SimpleNet: a SimpleNet model instance is returned upon successful instantiation. 
     """
     model_variant = "simplenetv1_9m_m2"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, scale=1.0, network_idx=1, mode=2, pretrained=pretrained, **model_args)
 
 
diff --git a/hubconf.py b/hubconf.py
index 0c83215..ac5d31f 100644
--- a/hubconf.py
+++ b/hubconf.py
@@ -4,7 +4,6 @@
 from torchvision.models import get_model_weights, get_weight
 
 from imagenet.simplenet import (
-    simplenet,
     simplenetv1_5m_m1,
     simplenetv1_5m_m2,
     simplenetv1_9m_m1,
diff --git a/imagenet/simplenet.py b/imagenet/simplenet.py
index 01dcf0b..e104792 100644
--- a/imagenet/simplenet.py
+++ b/imagenet/simplenet.py
@@ -405,7 +405,7 @@ def simplenet(pretrained: bool = False, **kwargs: Any) -> SimpleNet:
     return _gen_simplenet(model_variant, num_classes, in_chans, scale, network_idx, mode, pretrained, drop_rates)
 
 
-def remove_network_settings(kwargs: Dict[str, Any]) -> Dict[str, Any]:
+def _remove_network_settings(kwargs: Dict[str, Any]) -> Dict[str, Any]:
     """Removes network related settings passed in kwargs for predefined network configruations below
 
     Returns:
@@ -421,7 +421,7 @@ def simplenet_cifar_310k(pretrained: bool = False, **kwargs: Any) -> SimpleNet:
     that were used in the paper 
     """
     model_variant = "simplenet_cifar_310k"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, network_idx=2, mode=0, pretrained=pretrained, **model_args)
 
 
@@ -430,7 +430,7 @@ def simplenet_cifar_460k(pretrained: bool = False, **kwargs: Any) -> SimpleNet:
     that were used in the paper 
     """
     model_variant = "simplenet_cifar_460k"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, network_idx=3, mode=0, pretrained=pretrained, **model_args)
 
 
@@ -438,7 +438,7 @@ def simplenet_cifar_5m(pretrained: bool = False, **kwargs: Any) -> SimpleNet:
     """The original implementation of simplenet trained on cifar10/100 in caffe.
     """
     model_variant = "simplenet_cifar_5m"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, network_idx=4, mode=0, pretrained=pretrained, **model_args)
 
 
@@ -448,7 +448,7 @@ def simplenet_cifar_5m_extra_pool(pretrained: bool = False, **kwargs: Any) -> Si
     this is just here to be able to load the weights that were trained using this variation still available on the repository. 
     """
     model_variant = "simplenet_cifar_5m_extra_pool"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, network_idx=5, mode=0, pretrained=pretrained, **model_args)
 
 
@@ -464,7 +464,7 @@ def simplenetv1_small_m1_05(pretrained: bool = False, **kwargs: Any) -> SimpleNe
         SimpleNet: a SimpleNet model instance is returned upon successful instantiation. 
     """
     model_variant = "simplenetv1_small_m1_05"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, scale=0.5, network_idx=0, mode=1, pretrained=pretrained, **model_args)
 
 
@@ -479,7 +479,7 @@ def simplenetv1_small_m2_05(pretrained: bool = False, **kwargs: Any) -> SimpleNe
         SimpleNet: a SimpleNet model instance is returned upon successful instantiation. 
     """
     model_variant = "simplenetv1_small_m2_05"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, scale=0.5, network_idx=0, mode=2, pretrained=pretrained, **model_args)
 
 
@@ -494,7 +494,7 @@ def simplenetv1_small_m1_075(pretrained: bool = False, **kwargs: Any) -> SimpleN
         SimpleNet: a SimpleNet model instance is returned upon successful instantiation. 
     """
     model_variant = "simplenetv1_small_m1_075"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, scale=0.75, network_idx=0, mode=1, pretrained=pretrained, **model_args)
 
 
@@ -509,7 +509,7 @@ def simplenetv1_small_m2_075(pretrained: bool = False, **kwargs: Any) -> SimpleN
         SimpleNet: a SimpleNet model instance is returned upon successful instantiation. 
     """
     model_variant = "simplenetv1_small_m2_075"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, scale=0.75, network_idx=0, mode=2, pretrained=pretrained, **model_args)
 
 
@@ -524,7 +524,7 @@ def simplenetv1_5m_m1(pretrained: bool = False, **kwargs: Any) -> SimpleNet:
         SimpleNet: a SimpleNet model instance is returned upon successful instantiation. 
     """
     model_variant = "simplenetv1_5m_m1"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, scale=1.0, network_idx=0, mode=1, pretrained=pretrained, **model_args)
 
 
@@ -539,7 +539,7 @@ def simplenetv1_5m_m2(pretrained: bool = False, **kwargs: Any) -> SimpleNet:
         SimpleNet: a SimpleNet model instance is returned upon successful instantiation. 
     """
     model_variant = "simplenetv1_5m_m2"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, scale=1.0, network_idx=0, mode=2, pretrained=pretrained, **model_args)
 
 
@@ -554,7 +554,7 @@ def simplenetv1_9m_m1(pretrained: bool = False, **kwargs: Any) -> SimpleNet:
         SimpleNet: a SimpleNet model instance is returned upon successful instantiation. 
     """
     model_variant = "simplenetv1_9m_m1"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, scale=1.0, network_idx=1, mode=1, pretrained=pretrained, **model_args)
 
 
@@ -569,7 +569,7 @@ def simplenetv1_9m_m2(pretrained: bool = False, **kwargs: Any) -> SimpleNet:
         SimpleNet: a SimpleNet model instance is returned upon successful instantiation. 
     """
     model_variant = "simplenetv1_9m_m2"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, scale=1.0, network_idx=1, mode=2, pretrained=pretrained, **model_args)
 
 
diff --git a/imagenet/training_scripts/imagenet_training/timm/models/simplenet.py b/imagenet/training_scripts/imagenet_training/timm/models/simplenet.py
index 52ae526..e54a79e 100644
--- a/imagenet/training_scripts/imagenet_training/timm/models/simplenet.py
+++ b/imagenet/training_scripts/imagenet_training/timm/models/simplenet.py
@@ -437,7 +437,7 @@ def simplenet(pretrained: bool = False, **kwargs: Any) -> SimpleNet:
     return _gen_simplenet(model_variant, num_classes, in_chans, scale, network_idx, mode, pretrained, drop_rates)
 
 
-def remove_network_settings(kwargs: Dict[str, Any]) -> Dict[str, Any]:
+def _remove_network_settings(kwargs: Dict[str, Any]) -> Dict[str, Any]:
     """Removes network related settings passed in kwargs for predefined network configruations below
 
     Returns:
@@ -497,7 +497,7 @@ def simplenetv1_small_m1_05(pretrained: bool = False, **kwargs: Any) -> SimpleNe
         SimpleNet: a SimpleNet model instance is returned upon successful instantiation. 
     """
     model_variant = "simplenetv1_small_m1_05"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, scale=0.5, network_idx=0, mode=1, pretrained=pretrained, **model_args)
 
 
@@ -513,7 +513,7 @@ def simplenetv1_small_m2_05(pretrained: bool = False, **kwargs: Any) -> SimpleNe
         SimpleNet: a SimpleNet model instance is returned upon successful instantiation. 
     """
     model_variant = "simplenetv1_small_m2_05"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, scale=0.5, network_idx=0, mode=2, pretrained=pretrained, **model_args)
 
 
@@ -529,7 +529,7 @@ def simplenetv1_small_m1_075(pretrained: bool = False, **kwargs: Any) -> SimpleN
         SimpleNet: a SimpleNet model instance is returned upon successful instantiation. 
     """
     model_variant = "simplenetv1_small_m1_075"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, scale=0.75, network_idx=0, mode=1, pretrained=pretrained, **model_args)
 
 
@@ -545,7 +545,7 @@ def simplenetv1_small_m2_075(pretrained: bool = False, **kwargs: Any) -> SimpleN
         SimpleNet: a SimpleNet model instance is returned upon successful instantiation. 
     """
     model_variant = "simplenetv1_small_m2_075"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, scale=0.75, network_idx=0, mode=2, pretrained=pretrained, **model_args)
 
 
@@ -561,7 +561,7 @@ def simplenetv1_5m_m1(pretrained: bool = False, **kwargs: Any) -> SimpleNet:
         SimpleNet: a SimpleNet model instance is returned upon successful instantiation. 
     """
     model_variant = "simplenetv1_5m_m1"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, scale=1.0, network_idx=0, mode=1, pretrained=pretrained, **model_args)
 
 
@@ -577,7 +577,7 @@ def simplenetv1_5m_m2(pretrained: bool = False, **kwargs: Any) -> SimpleNet:
         SimpleNet: a SimpleNet model instance is returned upon successful instantiation. 
     """
     model_variant = "simplenetv1_5m_m2"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, scale=1.0, network_idx=0, mode=2, pretrained=pretrained, **model_args)
 
 
@@ -593,7 +593,7 @@ def simplenetv1_9m_m1(pretrained: bool = False, **kwargs: Any) -> SimpleNet:
         SimpleNet: a SimpleNet model instance is returned upon successful instantiation. 
     """
     model_variant = "simplenetv1_9m_m1"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, scale=1.0, network_idx=1, mode=1, pretrained=pretrained, **model_args)
 
 
@@ -609,7 +609,7 @@ def simplenetv1_9m_m2(pretrained: bool = False, **kwargs: Any) -> SimpleNet:
         SimpleNet: a SimpleNet model instance is returned upon successful instantiation. 
     """
     model_variant = "simplenetv1_9m_m2"
-    model_args = remove_network_settings(kwargs)
+    model_args = _remove_network_settings(kwargs)
     return _gen_simplenet(model_variant, scale=1.0, network_idx=1, mode=2, pretrained=pretrained, **model_args)