argparse是一個非常友善和常見的子產品,在深度學習的代碼實作中用的非常多,但是平時用的時候也會遇到很多問題,記錄一下,不斷補充
2021.7.7
遇到了parse_known_args() , 找了一篇寫的非常好的部落格,搬過來作為自己的學習筆記,怕後面找不到了。
parse_known_args()方法的用處就是有些時候,你的選項配置可能不會在一個函數或包中調用完成。例如在很多使用,我們可能會需要根據一些輸入的選項。
在深度學習中,我們可能會根據傳入的模型設定–model來決定我們調用的是哪個模型代碼,然後在該模型中還會有一部分的選項設定。
那麼這時候就會出現一種情況就是運作指令中會傳入所有需要設定的選項值,但是有時候僅擷取到基本設定時可能要進行一些操作然後才繼續導入剩下的參數設定。分開導入又太麻煩,此時使用parse_known_args()是一個非常好的選擇。
parse_known_args()方法的作用就是當僅擷取到基本設定時,如果運作指令中傳入了之後才會擷取到的其他配置資訊,先不會報錯,并将多出來的部分儲存起來,留到後面使用。
import argparse
def basic_options():
parser = argparse.ArgumentParser()
parser.add_argument('--data_mode', type=str, default= 'unaligned', help='chooses how datasets are loaded')
parser.add_argument('--mode', type=str, default='test', help='test mode')
return parser
def data_options(parser):
parser.add_argument('--lr', type=str, default='0.0001', help='learning rate')
return parser
if __name__ == '__main__':
parser = basic_options()
opt, unparsed = parser.parse_known_args()
print(opt)
print(unparsed)
parser = data_options(parser)
opt = parser.parse_args()
print(opt)
運作結果:
(deeplearning) [email protected]:~$ python test_data.py --data_mode aligned --lr 0.0002
Namespace(data_mode='aligned', mode='test')
['--lr', '0.0002']
Namespace(data_mode='aligned', lr='0.0002', mode='test')
該例子說明了在一開始僅導入了basic_options()選項時,多餘出來的–lr選項會被儲存起來,不會報錯,直到接下來導入了data_options(parser)之後再将其指派
這時候如果我們傳入一個沒有配置的選項,它在中間的時候也會儲存起來,但是最後就會報錯:
(deeplearning) [email protected]:~$ python test_data.py --data_mode aligned --lr 0.0002 --no_test True
Namespace(data_mode='aligned', mode='test')
['--lr', '0.0002', '--no_clue', 'True']
usage: test_data.py [-h] [--data_mode DATA_MODE] [--mode MODE] [--lr LR]
test_data.py: error: unrecognized arguments: --no_test True
其他:如果想要以字元串形式擷取選項值,在最後添加一行:
傳回:
(deeplearning) [email protected]:~$ python test_data.py --data_mode aligned --lr 0.0002
Namespace(data_mode='aligned', mode='test')
['--lr', '0.0002']
Namespace(data_mode='aligned', lr='0.0002', mode='test')
aligned_test_0.0002
參考:
https://www.cnblogs.com/wanghui-garcia/p/11267160.html