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()

```

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()

{"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"}]}