0. はじめに
卒論などで実装はできるようになった!あとは何回も実験をしよう!ってなると、Pythonのプログラムをseedを変えながら勝手に何回も繰り返し実行して、その結果を記録してくれたらな、、と思います。
そんなときに、シェルスクリプトを書いて実現してみようというお話です。
(他にも方法はいろいろありますが、個人的にはこれが1番楽な気がしました。が、初学者なので間違っているところやもっとこうするといいぞっていうのがぜひ教えてください、、)
実行環境
linux, python3.10.6
1. 実行したいプログラムに準備をする
まずは、実行したいプログラムに少し準備をします。
今回は実験結果の配列(下のコードだとhistory)はnumpyを使って.npyファイルに保存したいと思います。
なお、正しく実行できているか確認するためにもtime.time()を使って実行時間を結果の配列に含めておくと便利だと思います。
import numpy as np
#########自分の実行したいコード##########
#今回はhistoryという辞書型の結果を保存
#history = {'train_loss': [0.40233263224363325, 0.32183732837438583, 0.2516081020236015, 0.22328430339694022, 0.1859678439795971, 0.21593394204974176, 0.17237800508737564, 0.17367434203624726, 0.16175111159682273, 0.1389133520424366, 0.11057725325226783, 0.15094957053661345, 0.12318627089262009, 0.13979500029236078, 0.12451138123869895, 0.11403792835772038, 0.11816972605884075, 0.11392765827476978, 0.1022469524294138, 0.10136424899101257], 'validation_loss': [0.37975166263580323, 0.35040774707794187, 0.3559194508075714, 0.33262572576999666, 0.38052910313606264, 0.3622898992061615, 0.32906092183589936, 0.37429458775520325, 0.3865742824077606, 0.35881029706001283, 0.38273151392936705, 0.3649467830657959, 0.34276605443954467, 0.3479218934059143, 0.32179879121780397, 0.3375883677959442, 0.3298368800163269, 0.33175508177280427, 0.34887621765136717, 0.3764280668973923], 'validation_acc': [0.8793, 0.892, 0.8891, 0.9025, 0.8938, 0.8991, 0.9052, 0.8943, 0.8977, 0.9068, 0.9091, 0.9066, 0.9096, 0.9077, 0.9156, 0.9096, 0.9122, 0.9133, 0.9104, 0.9125], 'time': 25.568512439727783}
#とりあえずseedは1で設定
seed = 1
#/home/files/run/resultsというフォルダーにseedn(nは数字)といったseedの数が入ったファイル名で保存
PATH = '/home/files/run/results/seed{}.npy'.format(seed)
np.save(PATH, history)
2. シェルスクリプトの用意
次に、Pythonのプログラムを実行してくれるシェルスクリプトを書きます。
sedを使って先ほど用意したPythonファイル内のseed = 1の部分を書き換えながら実行してくれるようにします。
#今回は適当に20このseedを用意
seed_list=(1 16 62 97 105 161 230 356 624 728 905 1014 1130 1299 1336 1557 1616 1728 1922 2022)
for seed in ${seed_list[@]}
do
#実行したいファイル(/home/files/run/sample.py)にあるseed = 1を書き換えてtempファイルに保存
sed -e "s/seed = 1/seed = $seed/ " /home/files/run/sample.py > temp
#tempファイルの実行
python temp
done
シェルにて、次のコマンドで実行できます。
(* sh run.sh で実行するとデフォルトの(?)dashで実行されてしまい、リストの部分にエラーが出ました、、)
$ bash run.sh
3.保存した結果の確認
実行されると先ほど用意していたフォルダーにseed1.npy〜seedn.npyと結果がファイルに保存されているはずです。
これは次のような感じで取り出せます。
あとは出力したりプロットしたり、、numpyなので扱いやすいはずです。
import numpy as np
seed_list = (1, 16, 62, 97, 105, 161, 230, 356, 624, 728, 905, 1014, 1130, 1299, 1336, 1557, 1616, 1728, 1922, 2022)
for seed in seed_list:
#結果を保存したファイルのパス
path = '/home/files/run/results/seed{}.npy'.format(seed)
history = np.load(path, allow_pickle = True).item()
print(history)
これで簡単に実験できるようになりました!あとは寝てる間にでも回しとけばokです!