0

我正在尝试通过main.py从命令行调用将参数从文本文件加载到 ArgumentParser python main.py @input_args.txt

***main.py***

import run_training
from networks.zeoliteDNN import SixLayerNet_V2
from parser import parse_train_args, write_config_log


def main():
    net = SixLayerNet_V2()
    args = parse_train_args()
    net = run_training(net, args)
    write_config_log(args)


if __name__ == "__main__":
    main()
***input_args.txt***

--num_epochs   100
--batch_size   32
--optim        SGD_val
--init_lr      0.001
--patience     20
--factor       0.9
--clip_norm    True
--max_norm     20
--verbose      True
--print_every  5

我收到一个 SystemExit 2 错误,告诉我缺少必需的参数,即使我在 input_args.txt 中指定了它们。

Exception has occurred: SystemExit
2
  File "/Users/---/---/projects/ML-predictions/parser.py", line 94, in parse_train_args
    args = parser.parse_args()
  File "/Users/---/---/projects/ML-predictions/main.py", line 8, in main
    args = parse_train_args()
  File "/Users/---/---/projects/ML-predictions/main.py", line 14, in <module>
    main()

usage: main.py [-h] --num_epochs NUM_EPOCHS --batch_size BATCH_SIZE --optim
               {SGD,Adam,SGD_val} [--init_lr INIT_LR] [--l2_reg L2_REG]
               [--momentum MOMENTUM] [--dampening DAMPENING]
               [--nesterov NESTEROV] [--betas BETAS BETAS] [--eps EPS]
               [--factor FACTOR] [--patience PATIENCE] [--threshold THRESHOLD]
               [--cooldown COOLDOWN] [--clip_norm CLIP_NORM]
               [--max_norm MAX_NORM] [--verbose VERBOSE]
               [--print_every PRINT_EVERY]
main.py: error: the following arguments are required: --num_epochs, --batch_size, --optim

我定义了我的 ArgumentParser 以及如何在下面的两个函数中解析我的参数。

***parser.py***

def add_train_args(parser):
    """
    Add training arguments to an ArgumentParser.

    :params:
        parser: an ArgumentParser
    """
    # General arguments
    parser.add_argument('--num_epochs', type=int, required=True, 
                        help='Number of epochs')
    parser.add_argument('--batch_size', type=int, required=True,
                        help='Mini-batch size')
    # General optimizer arguments
    parser.add_argument('--optim', type=str, choices=['SGD', 'Adam', 'SGD_val'], required=True,
                        help='Optimization algorithm to use [options: SGD, Adam, SGD with validation (SGD_val)')
    parser.add_argument('--init_lr', default=1e-3, type=float, required=False,
                        help='Initial learning rate [default: 1e-3]')
    parser.add_argument('--l2_reg', default=0.0, type=float, required=False, 
                        help='L2 regularization')
    # SGD-specific arguments
    parser.add_argument('--momentum', default=0.9, type=float, required=False, 
                        help='Momentum factor [default: 0.9]')
    parser.add_argument('--dampening', default=0.0, type=float, required=False,
                        help='Dampening for momentum [default: 0.0]')
    parser.add_argument('--nesterov', default=False, type=bool, required=False,
                        help='Enable Nesterov momentum [default: False]')
    # Adam-specific arguments
    parser.add_argument('--betas', nargs=2, default=(0.9, 0.999), type=float, required=False, 
                        help='Coefficients used for computing running averages of gradient and its square [default: (0.9, 0.999)]')
    parser.add_argument('--eps', default=1e-8, type=float, required=False, 
                        help='Term added to the denominator to improve numerical stability [default: 1e-8]')
    # ReduceLROnPlateau learning rate scheduler arguments
    parser.add_argument('--factor', default=0.1, type=float, required=False, 
                        help='Multiplicative factor to reduce learning rate [default: 0.1]')
    parser.add_argument('--patience', default=100, type=int, required=False, 
                        help='Epochs outside threshold before reducing learning rate [default: 100]')
    parser.add_argument('--threshold', default=1e-4, type=float, required=False, 
                        help='Threshold for measuring the new optimum [default: 1e-4]')
    parser.add_argument('--cooldown', default=0, type=int, required=False, 
                        help='Epochs to wait to resume operation after learning rate has been reduced [default: 0]')
    # Gradient norm clipping arguments
    parser.add_argument('--clip_norm', default=False, type=bool, required=False, 
                        help='Enable gradient norm clipping [default: False]')
    parser.add_argument('--max_norm', default=5, type=float, required=False, 
                        help='Max norm of the gradients [default: 5]')
    # Printing arguments
    parser.add_argument('--verbose', default=True, type=bool, required=False, 
                        help='Enable real-time printing of training results [default: True]')
    parser.add_argument('--print_every', default=10, type=float, required=False, 
                        help='Interval of epochs to print results [default: 10]')


def parse_train_args():
    """
    Parses arguments for training and write arguments to config log file.
    
    :return: 
        args: parsed training arguments
    """
    parser = ArgumentParser(fromfile_prefix_chars='@')
    add_train_args(parser)
    args = parser.parse_args()

    return args

我不熟悉使用 argparse 从命令行运行 Python 脚本,但我之前已经让它工作了。现在我不确定我所做的更改会引发错误并且可以使用一些帮助。任何关于 argparse 更好实践的建议也将不胜感激。

谢谢。

编辑:解决方案是删除参数名称和参数之间的空格并将其替换为等号 (=)。

***input_args.txt***

--num_epochs=100
--batch_size=32
--optim=SGD_val
--init_lr=0.001
--patience=20
--factor=0.9
--clip_norm=True
--max_norm=20
--verbose=True
--print_every=5

4

0 回答 0