frgfm/torch-cam

target_layer path error

ReIDkj opened this issue · 3 comments

Bug description

My network structure is a little complex,when run:

cam_extractor = CAM(model, 'model.backbone.shared_module_bh.model_sh_fr.layer4[-1]') 

the error occurred:

ValueError: Unable to find all submodules ['model.backbone.shared_module_bh.model_sh_fr.layer4[-1]'] in the model

but print(model.backbone.shared_module_bh.model_sh_fr.layer4[-1]) is executable and correct
Is there any solution?
thanks

Code snippet to reproduce the bug

cam_extractor = CAM(model, 'model.backbone.shared_module_bh.model_sh_fr.layer4[-1]')

Error traceback

Current run is terminating due to exception: Unable to find all submodules ['model.backbone.shared_module_bh.model_sh_fr.layer4[-1]'] in the model
Engine run is terminating due to exception: Unable to find all submodules ['model.backbone.shared_module_bh.model_sh_fr.layer4[-1]'] in the model
Engine run is terminating due to exception: Unable to find all submodules ['model.backbone.shared_module_bh.model_sh_fr.layer4[-1]'] in the model
Traceback (most recent call last):
  File "train.py", line 256, in <module>
    train(cfg)
  File "train.py", line 208, in train
    engine.run(train_loader, max_epochs=cfg.num_epoch)
  File "/home/zhang/anaconda3/envs/RKJ/lib/python3.7/site-packages/ignite/engine/engine.py", line 326, in run
    self._handle_exception(e)
  File "/home/zhang/anaconda3/envs/RKJ/lib/python3.7/site-packages/ignite/engine/engine.py", line 291, in _handle_exception
    raise e
  File "/home/zhang/anaconda3/envs/RKJ/lib/python3.7/site-packages/ignite/engine/engine.py", line 319, in run
    self._fire_event(Events.COMPLETED)
  File "/home/zhang/anaconda3/envs/RKJ/lib/python3.7/site-packages/ignite/engine/engine.py", line 226, in _fire_event
    func(self, *(event_args + args), **kwargs)
  File "/home/zhang/E/RKJ/MAPnet/MPANet-dct/engine/__init__.py", line 67, in train_completed
    evaluator.run(query_loader)
  File "/home/zhang/anaconda3/envs/RKJ/lib/python3.7/site-packages/ignite/engine/engine.py", line 326, in run
    self._handle_exception(e)
  File "/home/zhang/anaconda3/envs/RKJ/lib/python3.7/site-packages/ignite/engine/engine.py", line 291, in _handle_exception
    raise e
  File "/home/zhang/anaconda3/envs/RKJ/lib/python3.7/site-packages/ignite/engine/engine.py", line 313, in run
    hours, mins, secs = self._run_once_on_dataset()
  File "/home/zhang/anaconda3/envs/RKJ/lib/python3.7/site-packages/ignite/engine/engine.py", line 280, in _run_once_on_dataset
    self._handle_exception(e)
  File "/home/zhang/anaconda3/envs/RKJ/lib/python3.7/site-packages/ignite/engine/engine.py", line 291, in _handle_exception
    raise e
  File "/home/zhang/anaconda3/envs/RKJ/lib/python3.7/site-packages/ignite/engine/engine.py", line 272, in _run_once_on_dataset
    self.state.output = self._process_function(self, batch)
  File "/home/zhang/E/RKJ/MAPnet/MPANet-dct/engine/engine.py", line 61, in _process_func
    cam_extractor = CAM(model, 'model.backbone.shared_module_bh.model_sh_fr.layer4[-1]')#layer4[2].conv3
  File "/home/zhang/anaconda3/envs/RKJ/lib/python3.7/site-packages/torchcam/methods/activation.py", line 61, in __init__
    super().__init__(model, target_layer, input_shape, **kwargs)
  File "/home/zhang/anaconda3/envs/RKJ/lib/python3.7/site-packages/torchcam/methods/core.py", line 64, in __init__
    raise ValueError(f"Unable to find all submodules {target_names} in the model")
ValueError: Unable to find all submodules ['model.backbone.shared_module_bh.model_sh_fr.layer4[-1]'] in the model

Environment

Collecting environment information...
TorchCAM version: 0.3.2.dev0
PyTorch version: 1.10.1

OS: Ubuntu 16.04.6 LTS

Python version: 3.7.13
Is CUDA available: Yes
CUDA runtime version: 10.0.130
GPU models and configuration: 
GPU 0: GeForce RTX 2080 Ti
GPU 1: GeForce RTX 2080 Ti
GPU 2: GeForce RTX 2080 Ti
GPU 3: GeForce RTX 2080 Ti

Nvidia driver version: 440.36
cuDNN version: Probably one of the following:
/usr/lib/x86_64-linux-gnu/libcudnn.so.8.0.4
/usr/lib/x86_64-linux-gnu/libcudnn_adv_infer.so.8.0.4
/usr/lib/x86_64-linux-gnu/libcudnn_adv_train.so.8.0.4
/usr/lib/x86_64-linux-gnu/libcudnn_cnn_infer.so.8.0.4
/usr/lib/x86_64-linux-gnu/libcudnn_cnn_train.so.8.0.4
/usr/lib/x86_64-linux-gnu/libcudnn_ops_infer.so.8.0.4
/usr/lib/x86_64-linux-gnu/libcudnn_ops_train.so.8.0.4
frgfm commented

Hello @ReIDkj 👋

Yes there is! Here is the explanation:

  • you can specify the target layer using a string argument or the module itself
  • when using the string version, the underneath mechanism uses the key of the state_dict which replaces index brackets [0] by a dot .0 (bare in mind that -1 won't work then

So you can either use the module itself (recommended):

cam_extractor = CAM(model, model.backbone.shared_module_bh.model_sh_fr.layer4[-1]) 

or use the string argument (below I supposed that the last item was at index 3):

cam_extractor = CAM(model, 'model.backbone.shared_module_bh.model_sh_fr.layer4.3') 

Hope this helps, let me know if some aspects are unclear :)
Cheers ✌️

Thank you!
code: cam_extractor = CAM(model, target_layer=model.backbone.shared_module_bh.model_sh_fr.layer4[-1].conv3, fc_layer=model.classifier) can work. The network structure should not add ' ' .

frgfm commented

Happy to help! I'll close the issue then, feel free to reopen if some details are unclear :)