Python-argparse库基本使用方法和add_argument() 参数详解

简单介绍

(1)创建 ArgumenParser 对象

(2)add_argument() 方法

(3)总结


简单介绍

官网:https://docs.python.org/3.6/library/argparse.html

 argparse库是一个存储参数库,可以用来进行模型训练过程中的参数保存作为一个整体,以便于使用和更改。内容是依据:python 3.6.10版本写的。

创建

import argparse
parser = argparse.ArgumentParser(description='Testing...') #创建对象

添加参数

parser.add_argument() ##添加单个命令参数

args = parser.parse_args() ##使得参数创建并生效

(1)创建 ArgumenParser 对象

class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True, allow_abbrev=True)

1->prog:the name of program 程序的名称 (默认:sys.argv[0])

2->usage:描述程序用法的字符串(默认:在利用add_argument时产生)

3->descripition:在使用 gragument help之前的说明文字 (默认:None)

4->epilog:在使用argument help后显示的一段文字(默认:None)[3-4命令类似于程序的说明书]

5->partents:一个列表形式的ArgumentParser对象,这个对象中的参数列表也要包含其中

6->formatter_class:用于自定义"帮助"输出的类

7->prefix_chars:前缀可选参数的字符集(默认值:' - ')

8->fromfile_prefix_chars:从前缀文件中读取的增加的可选参数的字符集(默认值:None)

9->argument_default:参数的全局默认值(默认值:None)

10->conflict_handler:解决选择冲突的方法(通常不需要)

11->add_help:是否允许向解析器添加-h/--help选项(默认值:True)

12->allow_abbrev:是否允许某些长字符串的选项用缩写代替,前提是缩写是明确的(默认值:True)

(2)add_argument() 方法

ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest]) 

有一些参数没有介绍,有两种情况:1,没理解 怕误导 2,不想写(-,-我好任性)

1->name or flags:位置参数或者可选参数名称,如foo 或者 -foo,--foo

       位置参数是按照输入的顺序赋值。可选参数是经过命令才会输入的。

例子:

import argparse

parser = argparse.ArgumentParser(description='Testing...') #创建对象

parser.add_argument('test',type=int) ##添加单个命令参数
parser.add_argument('test_1',type=float) ##type是输入的指定类型
parser.add_argument('-test_2','-i',type=float,default=2) ##dafault在没有命令输入时的默认值
## -test_2 命令 和 -i 命令相同
#parser.add_argument('-') ##添加单个命令参数

args = parser.parse_args() ##使得参数创建并生效

print(args.test+args.test_1)
print(args.test+args.test_2)

图:

                

2->action: 命令行遇到参数时的动作,默认值是 store.

      (1)action='store'表示存储参数值

      (2)action='store_const',表示赋值为const

parser.add_argument('-test',action='store_const',const=12)
print(args.test)

#action='store_const' 不能与type一起使用
命令行:python untitled.py -test
output:12
命令行:python untitled.py -test 13 #报错

      (3)action= 'store_true' or 'stror_false'

           这种情况参考这篇博客:https://blog.csdn.net/liuweiyuxiang/article/details/82918911

      (4)action='append' :将多次输入的参数值保存到一个list中。

parser.add_argument('-test',action='append')
print(args.test)

                      

                      

      (5)action='append_const' :类似于append使用,这次是使用const值,而不是输入给定。

parser.add_argument('-test',action='append_const',const=1)
parser.add_argument('-int',action='append_const',const=12.3)
print(args)

                                 

     (6)action='count' :存储遇到参数命令的次数     ;

parser.add_argument('-test',action='count')
print(args)

                              

     (7)action='help'; action='version' 感觉作用不大,有需要看官网。

3->nargs:命令行参数的数量

      在1->name or flag的例子可以看出,命令行传入的参数默认都是1,这个参数可以指定传入的参数个数。

      nargs有以下几种方式:

           (1)nargs=N(N 是一个大于等于1的整数)

parser.add_argument('test',type=int,nargs=2) ##该参数可以有两个输入
print(args.test)

                        

         (2)nargs='?'(允许不指定参数,利用const中的常量给予值)

parser.add_argument('-test',type=int,const=10,nargs='?') 
#允许不输入(也可以输入1个值)
print(args.test)

                                                

         注意:上面的情况和default参数是不同的,default可以允许 ‘python untitled1.py’ 输入,但是‘python untitled1.py -test’是不允许的,在未设置nargs参数时。

       还有其他几种参数类型,nargs='*'; nargs='+' ;  nargs='argparse.REMAINDER。不写了,看官网把。

4->const:在action或者nargs选项中设置的常量

      const与action和nargs配合使用。与action配合,看2->action='store_const'。与nargs配合看3->nargs='?'。

5->default:在没有参数输入时,默认输入值(具体看1->name or flag 中的例子)

6->type:命令行参数的类型(可看1->name or flag 中的例子)

7->choices:允许的参数集合

在1->name or flag 的例子可以看出,命令行只约定了传入类型,并没有约定传入的值,这个参数可以约定传入值。

parser.add_argument('test',type=int,choices=[1,3,5,7,9]) 
##约定只能传入1,3,5,7,9
print(args.test)

                              

8->required:是否可以省略命令行选项(仅限可选类型)(默认值为True)

parser.add_argument('-test',type=int,default=10,required=True) 
##required 规定-test参数是否可以省略
args = parser.parse_args() ##使得参数创建并生效
print(args.test)

从上图可以看出,如果设置了required=True是没有办法按照默认值,去使用-test参数的,默认值情况可以见1中的例子。

9->help:帮助简单的描述

10->metavar:参数使用信息名称(A name for the argument in usage messages)(没怎么看懂)

11->dest:命令的别称

parser.add_argument('-test',type=int,dest='a') 
# dest -test的别称
print(args.a) 
#等价于print(args.test)

(3)总结

详细总结argparse库,是因为看过斯cs224N的课程,里面有一些作业,是利用argparse去验证填充的代码部分是否可以通过验证。除了这个用处之外,github上有一些大牛是用这个库来存储训练模型使用的各种参数的,比如batch_size,epoch等参数然后调用的train的时候就直接调用args就可以了比较方便,也便于统一更改某些参数。下面举个简单的例子:

利用 argparse 存参数

import argparse
def parameter():
    parser = argparse.ArgumentParser(description='TextCNN model parameter ')
    parser.add_argument('-batch_size',default=10,help='the train batch size')
    parser.add_argument('-epoch',default=5,help='the time need train')
    parser.add_argument('-learing_rate',default=1e-3)
    parser.add_argument('-embed_size',default=100,help='the word dimensionality')
    parser.add_argument('-output_size',default=2)
    parser.add_argument('-k',default=10,help='the cross validation size')
    parser.add_argument('-dropout_rate',default=0.1,help='dropout layer')
    args = parser.parse_args() 
    
    return args

 加载函数,放到模型和训练模型中去用。

from  untitled1 import parameter

import torch
import torch.nn as nn
from torch.utils.data import DataLoader,Dataset
import torch.nn.functional as F

args = parameter() #参数

x = torch.rand(100,25,args.embed_size) #100个句子,25个词,embed_size
label = [0] *50 +[1]*50
label = torch.tensor(label,dtype=torch.long)


class DataSet(Dataset):
    def __init__(self,X,label):
        self.x_data = X
        self.y_data = label
        self.len = len(label)
    
    def __getitem__(self,index):
        return self.x_data[index],self.y_data[index]
    def __len__(self):
        return self.len
    
class textCNN(nn.Module):
    def __init__(self,words_num):
        super(textCNN, self).__init__()
        self.words_num = words_num
        self.embed_size = args.embed_size  #args
        self.class_num = args.output_size  #args
        self.drop_rate = args.dropout_rate
        
        self.conv1 = nn.Sequential(
            nn.Conv2d(1,3,(3,self.embed_size)),
            nn.BatchNorm2d(3)) ###in_channels, out_channels, kernel_size
        self.conv2 = nn.Sequential(
            nn.Conv2d(1,3,(4,self.embed_size)),
            nn.BatchNorm2d(3)) 
        self.conv3 = nn.Sequential(
            nn.Conv2d(1,3,(5,self.embed_size)),
            nn.BatchNorm2d(3))
        
        self.max_pool1 = nn.MaxPool1d(5)
        self.max_pool2 = nn.MaxPool1d(4)
        self.max_pool3 = nn.MaxPool1d(3)
        
        self.dropout = nn.Dropout(self.drop_rate)
        self.linear = nn.Linear(48,self.class_num) ##后面算出来的
        # 3 -> out_channels 3 ->kernel_size 1 ->max_pool
    
    def forward(self,sen_embed): #(batch,max_len,embed_size)
        sen_embed = sen_embed.unsqueeze(1) #(batch,in_channels,max_len,embed_size)
        
        conv1 = F.relu(self.conv1(sen_embed))  # ->(batch_size,out_channels,output.size,1)
        conv2 = F.relu(self.conv2(sen_embed))
        conv3 = F.relu(self.conv3(sen_embed))
        
        conv1 = torch.squeeze(conv1,dim=3)
        conv2 = torch.squeeze(conv2,dim=3)
        conv3 = torch.squeeze(conv3,dim=3)
        
        x1 = self.max_pool1(conv1)
        x2 = self.max_pool2(conv2)
        x3 = self.max_pool3(conv3) ##batch_size,out_channel,18
        
        x1 = x1.view(x1.size()[0],-1) ###batch_size 不能等于1
        x2 = x2.view(x2.size()[0],-1)
        x3 = x3.view(x3.size()[0],-1)
        
        x = torch.cat((x1,x2),dim=1)
        x = torch.cat((x,x3),dim=1)
        output = self.linear(self.dropout(x))
        
        return output 

dataset =  DataSet(x, label) 
data_loader = DataLoader(dataset,args.batch_size, shuffle=True) 

model = textCNN(25) #word_num

loss_function = nn.CrossEntropyLoss()
def train(args,model,data_loader,loss_function):
    optimizer = torch.optim.SGD(model.parameters(), lr=args.learing_rate)
    criterion = loss_function
    model.train() 
    for epoch in range(args.epoch): ##2个epoch
        for step,(x,target) in enumerate(data_loader): 
            output = model(x)
            loss = criterion(output,target)
            optimizer.zero_grad()
            #loss.backward()
            loss.backward(retain_graph=True)
            optimizer.step()
        print(epoch)
train(args,model,data_loader,loss_function)

 

上述内容,参考了以下几篇博客内容:(如有侵权,请联系本人删除)

【1】https://blog.csdn.net/tianzhiya121/article/details/89109071

【2】https://blog.csdn.net/Samaritan_x/article/details/84146029

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章