我是一名深度学习新手,目前正在研究许多神圣的对象检测 Github 存储库。然而,无论我看到什么,这些存储库中的训练/评估代码部分总是使用参数解析器呈现在命令行界面中。这是我正在研究的存储库中的一个示例:
parser.add_argument("--dataset_type", default="voc", type=str,
help='Specify dataset type. Currently support voc and open_images.')
parser.add_argument('--datasets', nargs='+', help='Dataset directory path')
parser.add_argument('--validation_dataset', help='Dataset directory path')
parser.add_argument('--balance_data', action='store_true',
help="Balance training data by down-sampling more frequent labels.")
parser.add_argument('--net', default="vgg16-ssd",
help="The network architecture, it can be mb1-ssd, mb1-lite-ssd, mb2-ssd-lite or vgg16-ssd.")
parser.add_argument('--freeze_base_net', action='store_true',
help="Freeze base net layers.")
parser.add_argument('--freeze_net', action='store_true',
help="Freeze all the layers except the prediction head.")
parser.add_argument('--mb2_width_mult', default=1.0, type=float,
help='Width Multiplifier for MobilenetV2')
我的意思是,为什么?参数解析器使得阅读代码和查看变量的位置变得非常困难。在上面的代码中,有近一百行参数解析器代码,我很难看出什么参数是什么。 Python 语法不是很方便吗,只需将所有训练参数转储到配置文件中即可?为什么每次训练时都要输入 3 行终端命令,而且为什么要把一个方便的 Python 程序变成看起来像命令行 ffmpeg 的东西?请任何人向我解释一下,我将非常感激。
但是,无论我看到什么,这些存储库中的训练/评估代码部分始终使用参数解析器呈现在命令行界面中。
至少它不是图形用户界面、混淆的 DLL,或者必须运行 Web 服务器才能使用的东西。与大型整体程序相比,命令行界面是小型模块化程序 Unix 哲学遗产的一部分。
为什么每次训练时都要输入 3 行终端命令,而且为什么要把一个方便的 Python 程序变成看起来像命令行 ffmpeg 的东西?
Python 代码具有多个接口是常见模式,例如参数解析可能位于从命令行运行的
if __name__=='__main__':
路径后面,但作者也可能期望其他人将模块导入到他们的程序中并调用直接运行。
Python 语法不是很方便吗,只需将所有训练参数转储到配置文件中即可?
Python 非常动态,因此您通常可以从自己的 Python 代码将参数传递给 argparse parse_args 函数的可选参数。 https://docs.python.org/3/library/argparse.html#argparse.ArgumentParser.parse_args
参数解析器使得阅读代码和查看变量的去向变得非常困难。在上面的代码中,这些参数解析器代码有近一百行,要弄清楚什么参数是什么真的让我很费劲。
大部分参数都有默认值,作者可能并不希望你填写每个参数。也有可能这个接口是为了他们自己的测试目的而设计的,他们只是希望你调用函数。