バッチ処理


1.バッチ


1-1. 手書き認識モデルシェイプの表示


jupyter-booknoteで
  • 以前の文書で使用したコードを実行しましょう.
  • は、x,W 1,W 2,W 3,Yの形状値を撮影します.

    1つのデータ配列、784要素からなる1次元配列が入力に入り、最終的に10要素配列のフローが出力されます.(1784)∧(100,10)=(1,10)*(1784)*(50100)*(50,10)=(1,10)∧(1784)∧(100,10)=(1,10)[x,W 1,W 2,W 3,yの順]
    上記のように.
  • では、一度に複数の画像をニューラルネットワークに渡すことができますか?もちろんいいですよ.以下の形式でモデルを構築すればよい.
    (100,784)∗(784,50)∗(50,100)∗(100,10)=(100,10)(100, 784) * (784, 50) * (50, 100) * (100, 10) = (100, 10)(100,784)∗(784,50)∗(50,100)∗(100,10)=(100,10)
    [x,W 1,W 2,W 3,y順]
    ここでx行列の行数は100個でも1000個でも構わない.学習/推論効率の観点から,適切な行為を選択すればよい.
    上記のようにモデルを構築すると、100枚の入力データの推定結果が一度に出力される.x[0]、y[0]は、それぞれ第1画像の平坦アレイと第1画像の予判結果を記憶し、x[84]、y[84]は、それぞれ第85画像の平坦アレイと第85画像の予判結果を記憶する.

    1-2. バッチの利点


    このように、複数の入力データを組み合わせたブロックをバッチと呼ぶ.バッチ処理はニューラルネットワーク関連演算の処理速度に有利である.
    例えば、前述のように、関数にデータを1つずつ渡す方式を用いると、データの取得、CPUの演算、データの再取得、CPUの演算などの一連のプロセスがデータセットのデータ数を繰り返すことになる.
    しかし、ある位置に格納されたデータを移動する速度は、CPUの演算速度よりもはるかに遅い.このため,モデルにデータを1つずつ入れると,CPUの空き時間が増加する.
    もちろん,単純なMNIST手書きデジタル認識モデルを実現するには,1つのデータを入力し,CPU上の演算を繰り返すだけでタスクを完了する.
    しかしながら、ニューラルネットワークが非常に複雑で、大きく、または入力データが非常に膨大であると、データの入出力に入る時間が蓄積され、ニューラルネットワーク処理の速度がかなり遅くなる.
    この場合、適切な導入処理により、頻繁なデータ移動によるボトルネックを改善できます.演算にGPUを用いる場合も同様である.
    ほとんどの数値計算ライブラリは高度に最適化されており、大規模なアレイを効率的に処理できるため、CPUの負荷を低減することができ、必要かどうかを考慮する必要はありません.
    配置寸法はモデルの性能に直接関係し,人為的に設定する必要があるHyper Parameterの1つである.レイアウトが大きすぎるとCPUに負荷がかかります.レイアウトが小さすぎると、前述のI/O遅延が大きくなります.これはボトルネックの問題ですので、学習/推定速度を速めるためにレイアウトサイズを適切に調整する必要があります.

    1-3. 手書きデジタル識別ニューラルネットワークにレイアウトを適用

    batch_size = 100 # 배치 사이즈
    accuracy_cnt = 0
    
    for i in range(0, len(x), batch_size): # 0 ~ len(x)까지 batch_size만큼씩 건너뛰어진 값을 내놓는 iterator 반환 
        y_batch = predict(network, x[i:i+batch_size])
        p = np.argmax(y_batch, axis=1)
        accuracy_cnt += np.sum(p == t[i:i+batch_size])
    
    print("Accuracy:" + str(float(accuracy_cnt) / len(x)))