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

 

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