介紹
寫train.py的時(shí)候,一般情況需要從命令行讀入?yún)?shù),經(jīng)常用到argparse,在這里以實(shí)用代碼為例寫一些使用說明。
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 說明
-
添加位置參數(shù)—— 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(短選項(xiàng)寫為-h)是唯一一個(gè)內(nèi)置的選項(xiàng)參數(shù),用于查看幫助信息。
$ 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
對(duì)于傳入的參數(shù),如果不聲明她的類型,就默認(rèn)當(dāng)作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就會(huì)報(bào)錯(cuò))
$ python3 prog.py 4
16
-
添加選項(xiàng)參數(shù)—— 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")
#這個(gè)程序中,--verbosity可以被賦予任意整型數(shù)值,但是在if判斷句中只有True False是有效的
#于是在后面我們做一些修改,添加了action參數(shù)
顧名思義,選項(xiàng)參數(shù)不調(diào)用不傳參數(shù)運(yùn)行也不會(huì)報(bào)錯(cuò)(選項(xiàng)參數(shù)會(huì)被賦予default值 --- None);如果在命令行中調(diào)用了,例如$ python3 prog.py --verbosity(這里verbosity需要給一個(gè)值,如1),則會(huì)報(bào)錯(cuò)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
一些小修改,給內(nèi)置action參數(shù)賦值"store_true"
parser.add_argument("--verbose", help="increase output verbosity",
action="store_true")
#這個(gè)意義是,如果選項(xiàng)參數(shù)被調(diào)用(不賦值),agrs.verbose就被賦予True
效果:
$ python3 prog.py --verbose
verbosity turned on
$ python3 prog.py --verbose 1 #賦值就會(huì)報(bào)錯(cuò),此時(shí)--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 #此時(shí)的help信息也與前面不同
對(duì)于短選項(xiàng)的使用,就是長(zhǎng)選項(xiàng)參數(shù)的簡(jiǎn)寫版,添加使用都非常簡(jiǎn)單:
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
-
位置參數(shù)與選項(xiàng)參數(shù)結(jié)合使用
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
#添加了選項(xiàng)參數(shù)square之后,沒有賦值--報(bào)錯(cuò)
$ 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
#發(fā)現(xiàn)選項(xiàng)參數(shù)和位置參數(shù)在命令行中的位置可以調(diào)換,不影響結(jié)果
-
add_mutually_exclusive_group() 沖突選項(xiàng)處理
似乎沒什么實(shí)際作用,主要就是調(diào)用--help的時(shí)候,usage信息里會(huì)給出沖突的選項(xiàng)參數(shù)。
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
################直接執(zhí)行的結(jié)果####################
$ 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.
#暫且用不上這個(gè)吧.就不予討論了
-
存疑
1.選項(xiàng)參數(shù)默認(rèn)接受類型是int型?
2.如果命令行中多個(gè)位置參數(shù)賦值,順序怎么定?
An: 按照位置參數(shù)的添加的順序賦值。
使用
-
NOTED
類似Linux命令的輸入形式,也就是命令 選項(xiàng) 參數(shù),選項(xiàng)和參數(shù)可輸可不輸,選項(xiàng)是命令的行為,加了選項(xiàng)也就是確定了命令的行為,參數(shù)是你命令執(zhí)行的對(duì)象。
Linux命令的一般格式為 :
$ command [option] [parameters]
對(duì)于選項(xiàng)參數(shù)(option)類型有兩種
1)短選項(xiàng)(short option):由一個(gè)連字符和一個(gè)字母構(gòu)成,例如:-a, -s等;
2)長(zhǎng)選項(xiàng)(long options):由兩個(gè)連字符和一些大小寫字母組合的單詞構(gòu)成,例如:--size,--help等。
通常,一個(gè)程序會(huì)提供short option和long options兩種形式,例如:ls -a,--all。另外,因?yàn)槎踢x項(xiàng)(short option)是可以合并的,例如:-sh表示-s和-h的組合,如果要表示為一個(gè)選項(xiàng)sh的話就需要用長(zhǎng)選項(xiàng)--sh。
NOTED: 不是所有的Linux命令都遵循以上的規(guī)則,對(duì)于一些命令,這個(gè)單雙連字符的規(guī)則似乎不起作用,例如:
find -type d -mindepth 2
find -name -fstype
-
一些小用例
1.兩個(gè)位置一個(gè)選項(xiàng):action = “count”,意思是數(shù)flag(調(diào)用選項(xiàng)參數(shù))的次數(shù)。所以flag兩次—“-vv”我們就執(zhí)行第一個(gè)print;如果沒有調(diào)用選項(xiàng)參數(shù),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