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)