prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  ModuleNotFoundError: No module named 'tools'
   i would like to test the result of training, so i write the next:
  (base) zhangshen@zhangshen-X550JX:~/mmdetection$ python tools/test.py configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth --out./result/result_100/pkl --eval bbox
  
  but i got:
  Traceback (most recent call last):
    File "tools/test.py", line 9, in <module>
      from tools.fuse_conv_bn import fuse_module
  ModuleNotFoundError: No module named 'tools'
  
  how can i solve this problem?
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `tools/fuse_conv_bn.py`
  Content:
  ```
  1 import argparse
  2 
  3 import torch
  4 import torch.nn as nn
  5 from mmcv.runner import save_checkpoint
  6 
  7 from mmdet.apis import init_detector
  8 
  9 
  10 def fuse_conv_bn(conv, bn):
  11     """During inference, the functionary of batch norm layers is turned off but
  12     only the mean and var alone channels are used, which exposes the chance to
  13     fuse it with the preceding conv layers to save computations and simplify
  14     network structures."""
  15     conv_w = conv.weight
  16     conv_b = conv.bias if conv.bias is not None else torch.zeros_like(
  17         bn.running_mean)
  18 
  19     factor = bn.weight / torch.sqrt(bn.running_var + bn.eps)
  20     conv.weight = nn.Parameter(conv_w *
  21                                factor.reshape([conv.out_channels, 1, 1, 1]))
  22     conv.bias = nn.Parameter((conv_b - bn.running_mean) * factor + bn.bias)
  23     return conv
  24 
  25 
  26 def fuse_module(m):
  27     last_conv = None
  28     last_conv_name = None
  29 
  30     for name, child in m.named_children():
  31         if isinstance(child, (nn.BatchNorm2d, nn.SyncBatchNorm)):
  32             if last_conv is None:  # only fuse BN that is after Conv
  33                 continue
  34             fused_conv = fuse_conv_bn(last_conv, child)
  35             m._modules[last_conv_name] = fused_conv
  36             # To reduce changes, set BN as Identity instead of deleting it.
  37             m._modules[name] = nn.Identity()
  38             last_conv = None
  39         elif isinstance(child, nn.Conv2d):
  40             last_conv = child
  41             last_conv_name = name
  42         else:
  43             fuse_module(child)
  44     return m
  45 
  46 
  47 def parse_args():
  48     parser = argparse.ArgumentParser(
  49         description='fuse Conv and BN layers in a model')
  50     parser.add_argument('config', help='config file path')
  51     parser.add_argument('checkpoint', help='checkpoint file path')
  52     parser.add_argument('out', help='output path of the converted model')
  53     args = parser.parse_args()
  54     return args
  55 
  56 
  57 def main():
  58     args = parse_args()
  59     # build the model from a config file and a checkpoint file
  60     model = init_detector(args.config, args.checkpoint)
  61     # fuse conv and bn layers of the model
  62     fused_model = fuse_module(model)
  63     save_checkpoint(fused_model, args.out)
  64 
  65 
  66 if __name__ == '__main__':
  67     main()
  68
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/tools/fuse_conv_bn.py b/tools/fuse_conv_bn.py
  deleted file mode 100644
  --- a/tools/fuse_conv_bn.py
  +++ /dev/null
  @@ -1,67 +0,0 @@
  -import argparse
  -
  -import torch
  -import torch.nn as nn
  -from mmcv.runner import save_checkpoint
  -
  -from mmdet.apis import init_detector
  -
  -
  -def fuse_conv_bn(conv, bn):
  -    """During inference, the functionary of batch norm layers is turned off but
  -    only the mean and var alone channels are used, which exposes the chance to
  -    fuse it with the preceding conv layers to save computations and simplify
  -    network structures."""
  -    conv_w = conv.weight
  -    conv_b = conv.bias if conv.bias is not None else torch.zeros_like(
  -        bn.running_mean)
  -
  -    factor = bn.weight / torch.sqrt(bn.running_var + bn.eps)
  -    conv.weight = nn.Parameter(conv_w *
  -                               factor.reshape([conv.out_channels, 1, 1, 1]))
  -    conv.bias = nn.Parameter((conv_b - bn.running_mean) * factor + bn.bias)
  -    return conv
  -
  -
  -def fuse_module(m):
  -    last_conv = None
  -    last_conv_name = None
  -
  -    for name, child in m.named_children():
  -        if isinstance(child, (nn.BatchNorm2d, nn.SyncBatchNorm)):
  -            if last_conv is None:  # only fuse BN that is after Conv
  -                continue
  -            fused_conv = fuse_conv_bn(last_conv, child)
  -            m._modules[last_conv_name] = fused_conv
  -            # To reduce changes, set BN as Identity instead of deleting it.
  -            m._modules[name] = nn.Identity()
  -            last_conv = None
  -        elif isinstance(child, nn.Conv2d):
  -            last_conv = child
  -            last_conv_name = name
  -        else:
  -            fuse_module(child)
  -    return m
  -
  -
  -def parse_args():
  -    parser = argparse.ArgumentParser(
  -        description='fuse Conv and BN layers in a model')
  -    parser.add_argument('config', help='config file path')
  -    parser.add_argument('checkpoint', help='checkpoint file path')
  -    parser.add_argument('out', help='output path of the converted model')
  -    args = parser.parse_args()
  -    return args
  -
  -
  -def main():
  -    args = parse_args()
  -    # build the model from a config file and a checkpoint file
  -    model = init_detector(args.config, args.checkpoint)
  -    # fuse conv and bn layers of the model
  -    fused_model = fuse_module(model)
  -    save_checkpoint(fused_model, args.out)
  -
  -
  -if __name__ == '__main__':
  -    main()
  
verification_info: {"golden_diff": "diff --git a/tools/fuse_conv_bn.py b/tools/fuse_conv_bn.py\ndeleted file mode 100644\n--- a/tools/fuse_conv_bn.py\n+++ /dev/null\n@@ -1,67 +0,0 @@\n-import argparse\n-\n-import torch\n-import torch.nn as nn\n-from mmcv.runner import save_checkpoint\n-\n-from mmdet.apis import init_detector\n-\n-\n-def fuse_conv_bn(conv, bn):\n-    \"\"\"During inference, the functionary of batch norm layers is turned off but\n-    only the mean and var alone channels are used, which exposes the chance to\n-    fuse it with the preceding conv layers to save computations and simplify\n-    network structures.\"\"\"\n-    conv_w = conv.weight\n-    conv_b = conv.bias if conv.bias is not None else torch.zeros_like(\n-        bn.running_mean)\n-\n-    factor = bn.weight / torch.sqrt(bn.running_var + bn.eps)\n-    conv.weight = nn.Parameter(conv_w *\n-                               factor.reshape([conv.out_channels, 1, 1, 1]))\n-    conv.bias = nn.Parameter((conv_b - bn.running_mean) * factor + bn.bias)\n-    return conv\n-\n-\n-def fuse_module(m):\n-    last_conv = None\n-    last_conv_name = None\n-\n-    for name, child in m.named_children():\n-        if isinstance(child, (nn.BatchNorm2d, nn.SyncBatchNorm)):\n-            if last_conv is None:  # only fuse BN that is after Conv\n-                continue\n-            fused_conv = fuse_conv_bn(last_conv, child)\n-            m._modules[last_conv_name] = fused_conv\n-            # To reduce changes, set BN as Identity instead of deleting it.\n-            m._modules[name] = nn.Identity()\n-            last_conv = None\n-        elif isinstance(child, nn.Conv2d):\n-            last_conv = child\n-            last_conv_name = name\n-        else:\n-            fuse_module(child)\n-    return m\n-\n-\n-def parse_args():\n-    parser = argparse.ArgumentParser(\n-        description='fuse Conv and BN layers in a model')\n-    parser.add_argument('config', help='config file path')\n-    parser.add_argument('checkpoint', help='checkpoint file path')\n-    parser.add_argument('out', help='output path of the converted model')\n-    args = parser.parse_args()\n-    return args\n-\n-\n-def main():\n-    args = parse_args()\n-    # build the model from a config file and a checkpoint file\n-    model = init_detector(args.config, args.checkpoint)\n-    # fuse conv and bn layers of the model\n-    fused_model = fuse_module(model)\n-    save_checkpoint(fused_model, args.out)\n-\n-\n-if __name__ == '__main__':\n-    main()\n", "issue": "ModuleNotFoundError: No module named 'tools'\n i would like to test the result of training, so i write the next:\r\n(base) zhangshen@zhangshen-X550JX:~/mmdetection$ python tools/test.py configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth --out./result/result_100/pkl --eval bbox\r\n\r\nbut i got:\r\nTraceback (most recent call last):\r\n  File \"tools/test.py\", line 9, in <module>\r\n    from tools.fuse_conv_bn import fuse_module\r\nModuleNotFoundError: No module named 'tools'\r\n\r\nhow can i solve this problem?\n", "before_files": [{"content": "import argparse\n\nimport torch\nimport torch.nn as nn\nfrom mmcv.runner import save_checkpoint\n\nfrom mmdet.apis import init_detector\n\n\ndef fuse_conv_bn(conv, bn):\n    \"\"\"During inference, the functionary of batch norm layers is turned off but\n    only the mean and var alone channels are used, which exposes the chance to\n    fuse it with the preceding conv layers to save computations and simplify\n    network structures.\"\"\"\n    conv_w = conv.weight\n    conv_b = conv.bias if conv.bias is not None else torch.zeros_like(\n        bn.running_mean)\n\n    factor = bn.weight / torch.sqrt(bn.running_var + bn.eps)\n    conv.weight = nn.Parameter(conv_w *\n                               factor.reshape([conv.out_channels, 1, 1, 1]))\n    conv.bias = nn.Parameter((conv_b - bn.running_mean) * factor + bn.bias)\n    return conv\n\n\ndef fuse_module(m):\n    last_conv = None\n    last_conv_name = None\n\n    for name, child in m.named_children():\n        if isinstance(child, (nn.BatchNorm2d, nn.SyncBatchNorm)):\n            if last_conv is None:  # only fuse BN that is after Conv\n                continue\n            fused_conv = fuse_conv_bn(last_conv, child)\n            m._modules[last_conv_name] = fused_conv\n            # To reduce changes, set BN as Identity instead of deleting it.\n            m._modules[name] = nn.Identity()\n            last_conv = None\n        elif isinstance(child, nn.Conv2d):\n            last_conv = child\n            last_conv_name = name\n        else:\n            fuse_module(child)\n    return m\n\n\ndef parse_args():\n    parser = argparse.ArgumentParser(\n        description='fuse Conv and BN layers in a model')\n    parser.add_argument('config', help='config file path')\n    parser.add_argument('checkpoint', help='checkpoint file path')\n    parser.add_argument('out', help='output path of the converted model')\n    args = parser.parse_args()\n    return args\n\n\ndef main():\n    args = parse_args()\n    # build the model from a config file and a checkpoint file\n    model = init_detector(args.config, args.checkpoint)\n    # fuse conv and bn layers of the model\n    fused_model = fuse_module(model)\n    save_checkpoint(fused_model, args.out)\n\n\nif __name__ == '__main__':\n    main()\n", "path": "tools/fuse_conv_bn.py"}], "after_files": [{"content": null, "path": "tools/fuse_conv_bn.py"}]}