ニューラルネットワーク学習時に進み具合を表示する簡単な方法
はじめに
ニューラルネットワークの学習で、進行度合を文字ではなく、 プログレスバーのような目で見える形にするとわかりやすい。 tqdmというライブラリを使い、学習経過をプログレスバーで簡単に表示できるので試してみる。
tqdmとは
簡単に、コマンドライン上にプログレスバーを表示でき、 経過時間と予測時間も表示してくれる便利なpythonライブラリ。
インストール方法
pip install tqdm
プログレスバーの表示
使用ライブラリとバージョン
プログレスバー表示
- tqdm : 4.38.0
試してみる
ニューラルネットワークの学習の時のことを考えて、試してみる。
datasetで1epoch分、つまりdatasetの数(下の例ではデータ6個分を学習するのを1epoch)だけ学習するとする。 下のコードのようにdatasetがあり、データを読み込み、 time.sleep()部分が学習部分とする。 このままだと、何も表示されず学習の結果がわかりにくい。 そこで、プログレスバーを表示して、学習状況を見やすくしてみる。
import time dataset=["a","b","c","d","e","f"] for data in dataset: time.sleep(0.5)
出力
上のコードに少し足すだけで、プログレスバーを表示できる。for文でのデータセットの部分をtqdm
でおおう。
tqdm
の引数は、iterable(反復可能)なもので、
range()
などを引数として入れられる。
これだけで、簡単にバーを表示できる。
表示は、進行度の%、処理した数と処理すべき合計数、経過時間、残り時間の予測、処理スピードなどの情報が表示される。
import time from tqdm import tqdm dataset=["a","b","c","d","e","f"] for data in tqdm(dataset): time.sleep(0.5)
出力
手動でプログレスバーを操作する方法もある。
tqdm
の引数のtotal
に合計値を入れ、tqdmのインスタンスpbarとする。
手動でupdate(n)
を使い、nだけ増やしていく。
dataset=["a","b","c","d","e","f"] with tqdm(total=len(dataset)) as pbar: for data in dataset: time.sleep(0.5) pbar.update(1)
出力
学習の時、現在の精度やlossなどの値も確認したいので、表示してみる。
情報を表示するには、set_postfix(dict)
を用いることで表示できる。
引数には、キーが表示したい名前、辞書の値が表示したい値の辞書をいれる。
dataset=["a","b","c","d","e","f"] accuracy=0 with tqdm(total=len(dataset)) as pbar: for data in dataset: time.sleep(0.5) accuracy=accuracy+10 pbar.set_postfix({"accuracy":accuracy}) pbar.update(1)
出力
また、学習には1epoch分だけでなく、何epochも行う。 これをバーで表示すると、何個もバーが連なり、 現在が何epoch目かがわからないようになる。
dataset=["a","b","c","d","e","f"] num_epochs=10 for epoch in range(1,num_epochs+1): #1epoch分の学習 with tqdm(total=len(dataset)) as pbar: for data in dataset: time.sleep(0.5) pbar.update(1)
出力
そこで、前側にepoch数を書いておくことで、現在の進行度がわかるようになる。
バーの前側に文字を表示するのは、set_description()
dataset=["a","b","c","d","e","f"] num_epochs=10 for epoch in range(1,num_epochs+1): #1epoch分の学習 with tqdm(total=len(dataset)) as pbar: for data in dataset: time.sleep(0.5) pbar.set_description(f"Epoch[{epoch}/{num_epochs}]") pbar.update(1)
出力
まとめ
学習の過程を見てわかりやすいように、プログレスバーで表示してみた。 データセットなどのiterableな部分をtqdmで包むだけで、 簡単に表示でき使いやすい。 ニューラルネットワークの学習にも使っていきたい。