msdd’s blog

deep learning勉強中。プログラム関連のこと書きます。

ニューラルネットワーク学習時に進み具合を表示する簡単な方法

はじめに

ニューラルネットワークの学習で、進行度合を文字ではなく、 プログレスバーのような目で見える形にするとわかりやすい。 tqdmというライブラリを使い、学習経過をプログレスバーで簡単に表示できるので試してみる。

tqdmとは

簡単に、コマンドライン上にプログレスバーを表示でき、 経過時間と予測時間も表示してくれる便利なpythonライブラリ。

f:id:msdd:20200324215316g:plain

インストール方法

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)

出力

f:id:msdd:20200324215316g:plain

手動でプログレスバーを操作する方法もある。 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)

出力

f:id:msdd:20200324215403g:plain

学習の時、現在の精度や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)

出力

f:id:msdd:20200324215424g:plain

また、学習には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)

出力

f:id:msdd:20200324215443g:plain

そこで、前側に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)

出力

f:id:msdd:20200324215520g:plain

まとめ

学習の過程を見てわかりやすいように、プログレスバーで表示してみた。 データセットなどのiterableな部分をtqdmで包むだけで、 簡単に表示でき使いやすい。 ニューラルネットワークの学習にも使っていきたい。