介绍
写train.py的时候,一般情况需要从命令行读入参数,经常用到argparse,在这里以实用代码为例写一些使用说明。
import torch
import torch.nn as nn
import torch.optim as optim
from torch.optim import lr_scheduler
from torch.autograd import Variable
import torch.nn.initasinit
from torchvision import models, transforms
from torch.utils.data import Dataset, DataLoader
from torch.nn import DataParallel
import os
from PIL import Image, ImageOps
import time
import pickle
import numpy as np
from torchvision.transforms import Lambda
import argparse
import copy
import random
import numbers
parser = argparse.ArgumentParser(description=' c3d training')
parser.add_argument('-g','--gpu',default=[2],nargs='+',type=int,help='index of gpu to use, default 2')
parser.add_argument('-s','--seq',default=4,type=int,help='sequence length, default 4')
parser.add_argument('-t','--train',default=100,type=int,help='train batch size, default 100')
parser.add_argument('-v','--val',default=8,type=int,help='valid batch size, default 8')
parser.add_argument('-o','--opt',default=1,type=int,help='0 for sgd 1 for adam, default 1')
parser.add_argument('-m','--multi',default=1,type=int,help='0 for single opt, 1 for multi opt, default 1')
parser.add_argument('-e','--epo',default=25,type=int,help='epochs to train and val, default 25')
parser.add_argument('-w','--work',default=2,type=int,help='num of workers to use, default 2')
parser.add_argument('-f','--flip',default=0,type=int,help='0 for not flip, 1 for flip, default 0')
parser.add_argument('-c','--crop',default=1,type=int,help='0 rand, 1 cent, 5 five_crop, 10 ten_crop, default 1')
parser.add_argument('-l','--lr',default=1e-3,type=float,help='learning rate for optimizer, default 1e-3')
parser.add_argument('--momentum',default=0.9,type=float,help='momentum for sgd, default 0.9')
parser.add_argument('--weightdecay',default=0,type=float,help='weight decay for sgd, default 0')
parser.add_argument('--dampening',default=0,type=float,help='dampening for sgd, default 0')
parser.add_argument('--nesterov',default=False,type=bool,help='nesterov momentum, default False')
parser.add_argument('--sgdadjust',default=1,type=int,help='sgd method adjust lr 0 for step 1 for min, default 1')
parser.add_argument('--sgdstep',default=5,type=int,help='number of steps to adjust lr for sgd, default 5')
parser.add_argument('--sgdgamma',default=0.1,type=float,help='gamma of steps to adjust lr for sgd, default 0.1')
args=parser.parse_args()
gpu_usg=",".join(list(map(str, args.gpu)))
sequence_length = args.seq
train_batch_size = args.train
val_batch_size = args.val
optimizer_choice = args.opt
multi_optim = args.multi
epochs = args.epo
workers = args.work
use_flip = args.flip
crop_type = args.crop
learning_rate = args.lr
momentum = args.momentum
weight_decay = args.weightdecay
dampening = args.dampening
use_nesterov = args.nesterov
sgd_adjust_lr = args.sgdadjust
sgd_step = args.sgdstep
sgd_gamma = args.sgdgamma
add_argument 说明
-
添加位置参数—— positional arguments: "echo"
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo", help="echo the string you use here")
args = parser.parse_args()
print(args.echo)
效果:--help(短选项写为-h)是唯一一个内置的选项参数,用于查看帮助信息。
$ python3 prog.py
usage: prog.py [-h] echo
prog.py: error: the following arguments are required: echo
#########################
$ python3 prog.py --help
usage: prog.py [-h] echo
positional arguments:
echo echo the string you use here
optional arguments:
-h, --help show this help message and exit
#########################
$ python3 prog.py foo
foo
对于传入的参数,如果不声明她的类型,就默认当作str型处理。
parser.add_argument("square", help="display a square of a given number",
type=int)
args = parser.parse_args()
print(args.square**2)
效果:(如果不声明type = int就会报错)
$ python3 prog.py 4
16
-
添加选项参数—— optional arguments
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbosity", help="increase output verbosity")
args = parser.parse_args()
if args.verbosity:
print("verbosity turned on")
#这个程序中,--verbosity可以被赋予任意整型数值,但是在if判断句中只有True False是有效的
#于是在后面我们做一些修改,添加了action参数
顾名思义,选项参数不调用不传参数运行也不会报错(选项参数会被赋予default值 --- None);如果在命令行中调用了,例如$ python3 prog.py --verbosity(这里verbosity需要给一个值,如1),则会报错error: argument --verbosity: expected one argument。
效果:
$ python3 prog.py --verbosity 1
verbosity turned on
$ python3 prog.py
$ python3 prog.py --help
usage: prog.py [-h] [--verbosity VERBOSITY]
optional arguments:
-h, --help show this help message and exit
--verbosity VERBOSITY
increase output verbosity
$ python3 prog.py --verbosity
usage: prog.py [-h] [--verbosity VERBOSITY]
prog.py: error: argument --verbosity: expected one argument
一些小修改,给内置action参数赋值"store_true"
parser.add_argument("--verbose", help="increase output verbosity",
action="store_true")
#这个意义是,如果选项参数被调用(不赋值),agrs.verbose就被赋予True
效果:
$ python3 prog.py --verbose
verbosity turned on
$ python3 prog.py --verbose 1 #赋值就会报错,此时--verbose功能等于flag
usage: prog.py [-h] [--verbose]
prog.py: error: unrecognized arguments: 1
$ python3 prog.py --help
usage: prog.py [-h] [--verbose]
optional arguments:
-h, --help show this help message and exit
--verbose increase output verbosity #此时的help信息也与前面不同
对于短选项的使用,就是长选项参数的简写版,添加使用都非常简单:
parser.add_argument("-v", "--verbose", help="increase output verbosity",
action="store_true")
################效果##################
$ python3 prog.py -v
verbosity turned on
$ python3 prog.py --help
usage: prog.py [-h] [-v]
optional arguments:
-h, --help show this help message and exit
-v, --verbose increase output verbosity
-
位置参数与选项参数结合使用
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
help="display a square of a given number")
parser.add_argument("-v", "--verbose", action="store_true",
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbose:
print("the square of {} equals {}".format(args.square, answer))
else:
print(answer)
效果:
$ python3 prog.py
usage: prog.py [-h] [-v] square
prog.py: error: the following arguments are required: square
#添加了选项参数square之后,没有赋值--报错
$ python3 prog.py 4
16
$ python3 prog.py 4 --verbose
the square of 4 equals 16
$ python3 prog.py --verbose 4
the square of 4 equals 16
#发现选项参数和位置参数在命令行中的位置可以调换,不影响结果
-
add_mutually_exclusive_group() 冲突选项处理
似乎没什么实际作用,主要就是调用--help的时候,usage信息里会给出冲突的选项参数。
import argparse
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
args = parser.parse_args()
answer = args.x**args.y
if args.quiet:
print(answer)
elif args.verbose:
print("{} to the power {} equals {}".format(args.x, args.y, answer))
else:
print("{}^{} == {}".format(args.x, args.y, answer))
效果:
$ python3 prog.py 4 2
4^2 == 16
$ python3 prog.py 4 2 -q
16
$ python3 prog.py 4 2 -v
4 to the power 2 equals 16
$ python3 prog.py 4 2 -vq
usage: prog.py [-h] [-v | -q] x y
prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
$ python3 prog.py 4 2 -v --quiet
usage: prog.py [-h] [-v | -q] x y
prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
################直接执行的结果####################
$ python3 prog.py 4 2
4^2 == 16
$ python3 prog.py 4 2 -q
16
$ python3 prog.py 4 2 -v
4 to the power 2 equals 16
$ python3 prog.py 4 2 -vq
usage: prog.py [-h] [-v | -q] x y
prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
$ python3 prog.py 4 2 -v --quiet
usage: prog.py [-h] [-v | -q] x y
prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
#################看一下help信息###################
$ python3 prog.py --help
usage: prog.py [-h] [-v | -q] x y
calculate X to the power of Y
positional arguments:
x the base
y the exponent
optional arguments:
-h, --help show this help message and exit
-v, --verbose
-q, --quiet
##########来自官方document的解答##########
Note that slight difference in the usage text. Note the [-v | -q],
which tells us that we can either use -v or -q, but not both at the same time.
#暂且用不上这个吧.就不予讨论了
-
存疑
1.选项参数默认接受类型是int型?
2.如果命令行中多个位置参数赋值,顺序怎么定?
An: 按照位置参数的添加的顺序赋值。
使用
-
NOTED
类似Linux命令的输入形式,也就是命令 选项 参数,选项和参数可输可不输,选项是命令的行为,加了选项也就是确定了命令的行为,参数是你命令执行的对象。
Linux命令的一般格式为 :
$ command [option] [parameters]
对于选项参数(option)类型有两种
1)短选项(short option):由一个连字符和一个字母构成,例如:-a, -s等;
2)长选项(long options):由两个连字符和一些大小写字母组合的单词构成,例如:--size,--help等。
通常,一个程序会提供short option和long options两种形式,例如:ls -a,--all。另外,因为短选项(short option)是可以合并的,例如:-sh表示-s和-h的组合,如果要表示为一个选项sh的话就需要用长选项--sh。
NOTED: 不是所有的Linux命令都遵循以上的规则,对于一些命令,这个单双连字符的规则似乎不起作用,例如:
find -type d -mindepth 2
find -name -fstype
-
一些小用例
1.两个位置一个选项:action = “count”,意思是数flag(调用选项参数)的次数。所以flag两次—“-vv”我们就执行第一个print;如果没有调用选项参数,default就是0。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
parser.add_argument("-v", "--verbosity", action="count", default=0)
args = parser.parse_args()
answer = args.x**args.y
if args.verbosity >= 2:
print("Running '{}'".format(__file__))
if args.verbosity >= 1:
print("{}^{} == ".format(args.x, args.y), end="")
print(answer)
######################效果########################
$ python3 prog.py 4 2
16
$ python3 prog.py 4 2 -v
4^2 == 16
$ python3 prog.py 4 2 -vv
Running 'prog.py'
4^2 == 16
网友评论