2-01 画像データの整数化(量子化)

●FPGAでは小数は扱えない

 小数の演算を行うにはFPU(Floating Point Unit)が必要ですが、一般的なFPGAにそれはありません。したがってPythonの段階で定数や変数を
整数化しておきます。

 図2‐01は積和演算のイメージですが、同図(a)のように入力画像Xと重み係数Wが乗算されます。その後バイアスbが加算され、結果はX * W + bとなります。

図2-01 積和演算の整数化。バイアスは256の2乗をかけてバランスをとる

●XとWは256倍、bはさらに256倍する

 同図(b)はそれらを整数で行うイメージです。まず画像Xを
256倍して小数点以下を切り捨てることにより整数化します。重み係数Wも同様に256倍して整数化し、それらを乗算するとX * W * 256 * 256 になります。
 バイアスbは
256 * 256倍して整数化して加算します。その結果はX * W * 256 * 256 + b * 256 * 256となります。
 最後にそれを
1/256します。出力は(X * W + b) * 256となり、同図(a)の出力を256倍して整数化したものと等しくなります。

PNGファイルの画素データ(整数)をそのまま使う

 図2‐02に画像を整数化する部分を示します。オリジナルのPythonにはX_test = X_test/255がありましたが、それを
コメントアウトします。これだけで入力画像の整数化は終わりです(*1)。

(*1)画像ファイル(PNG形式)のデータは元々整数(0〜255の範囲)。オリジナルのPythonではそれを255で割って小数にしていた(画素の最大値が255なので255で割っていたが、255でも256でも大差ない)

図2‐02 入力画像の整数化のために一行コメントアウトする

●積和演算の後は1/256にする

 整数化した画像をCNNに入力しますが、整数同士の乗算を繰り返すと値がどんどん大きくなってしまいます。図2‐01(b)で出力を1/256しているのはそれを防ぐためです。
 図2‐03にPythonのその部分を示します。6層目以外はすべて
1/256されています。

図2‐03 各層の出力を256で割っている


次のページへ


目次へ戻る