最近項目組開始進入寫論文的階段,開始瘋狂做實驗了,不像之前的隻是做一兩組實驗看效果,現在光資料集就準備了4種,要跑的實驗也多起來了,把最近學到的跑實驗的小技巧總結一下,以後記得使用。
1.寫一個shell腳本跑實驗
使用shell腳本跑實驗的好處就是可以通過一個檔案就把好幾組的測試組跑完,不需要每過幾十分鐘就去看一下,跑新的實驗,弄的人很煩躁。具體怎麼使用shell腳本來跑實驗呢?以我目前跑的音頻對抗樣本的實驗為例:
#!/bin/bash # 定義使用哪種sh解釋器來解釋腳本
start_time=$(date +%s) #記錄開始時間
'''下面就是一組實驗中所需要設定的參數,輸入,要轉換的目标句子,輸出,實驗結果的存儲,确定使用的gpu塊'''
python3 attack_pgd_modify_partial.py --in ./dataset/maestro_wav/maestro15.wav \
./dataset/maestro_wav/maestro82.wav \
./dataset/maestro_wav/maestro13.wav \
./dataset/maestro_wav/maestro23.wav \
./dataset/maestro_wav/maestro80.wav \
./dataset/maestro_wav/maestro67.wav \
./dataset/maestro_wav/maestro31.wav \
./dataset/maestro_wav/maestro45.wav \
./dataset/maestro_wav/maestro7.wav \
./dataset/maestro_wav/maestro70.wav \
--target "down below in the darkness were hundreds of people sleeping in peace"\
--out ./dataset_adv/ddataset_pgd_partial/mae/maestro15.wav \
./dataset_adv/ddataset_pgd_partial/mae/maestro82.wav \
./dataset_adv/ddataset_pgd_partial/mae/maestro13.wav \
./dataset_adv/ddataset_pgd_partial/mae/maestro23.wav \
./dataset_adv/ddataset_pgd_partial/mae/maestro80.wav \
./dataset_adv/ddataset_pgd_partial/mae/maestro67.wav \
./dataset_adv/ddataset_pgd_partial/mae/maestro31.wav \
./dataset_adv/ddataset_pgd_partial/mae/maestro45.wav \
./dataset_adv/ddataset_pgd_partial/mae/maestro7.wav \
./dataset_adv/ddataset_pgd_partial/mae/maestro70.wav \
--restore_path deepspeech-0.4.1-checkpoint_rename/model.v0.4.1 --iterations 500 --res_file "./tmp/res_pgd_partial_mae500.txt" --gpu 1
接下來,就是重複上面一組實驗的過程,替換其中的輸入,輸出,來構造多組實驗:
最後,再添加實驗都跑完的結束标志:
end_time=$(date +%s)
cost_time=$[ $end_time-$start_time ]
echo "build kernel time is $(($cost_time/60))min $(($cost_time%60))s"
這樣一個shell腳本就完成了,接下來就是我們怎麼運作這個shell腳本來跑我們預設好的實驗,以上面這個名為:pgd_partial_mae500的shell腳本為例:
即,找到該.sh檔案所在的檔案夾,在其中執行指令:
bash ./檔案名.sh
2.tmux的使用
當可以熟練運用shell腳本來跑實驗之後,還有一個問題就是當有多組不同的參數設定的實驗時如何實作并行操作,我們可以使用tmux來提高效率,同時跑幾個shell腳本,tmux可以稱為linux上的終端複用神器了。
主要要用到的tmux操作有如下幾個:
tmux new -s xxx #建立一個終端窗體(僞終端)用來執行新的shell腳本,其中xxx為所設定的這個新窗體的名字,通常以你要跑的檔案的名字命名
以要執行一個pgd_ps_mae50.sh檔案為例:
先建立一個新窗體:
建立成功之後,會直接跳到這個窗體之中,在這裡面進行執行
bash ./pgd_ps_mae50.sh
:
當我們輸入了對應的執行指令,現在想要開始跑第二個shell腳本實驗,那就要先跳出這個窗體,回到我們真正的終端,通過
ctrl+b d
指令跳回一開始的終端。需要注意的是這實際上是兩個步驟,ctrl+b然後再輸入d跳回。
那麼,當過去了一段時間,我們想看一看程式跑完了沒,怎麼再回到之前的窗體中去呢?這時候我們引入第二個tmux指令:
tmux attach -t XXX #這條指令的意思就是由終端進入之前曾經建立好的窗體中去,如果xxx窗體不存在會報錯
檢查之後,發現程式已經跑完了,接下來我們就需要對這個窗體進行處理:
首先,回到終端,通過
tmux ls
來對已建立的窗體進行一個周遊檢視:
發現我們剛剛建立的那個pgd_ps_mae50的窗體還在,而我們又用不到它了,這時候通過tmux的kill操作來删除它:
tmux kill-session -t XXX
執行之後,通過ls可以看到剛剛建立的窗體已經删除了:
3.pycharm快捷鍵
因為要經常的替換參數,是以能夠一起替換是最好的了,下面兩個指令不止在pycharm中,很多軟體中也很常用:
ctrl/command + f 搜尋
ctrl/command + r 批量替換