簡單介紹
官網: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