3-04 SoftMax関数の整数版

●SoftMax関数の結果を閾値と比べている

 このブロック図の最終段、認識結果の前に「閾値と比較」のブロックがあります。conf層の出力をある閾値と比較し、大きければ「物体検出」となります。

 オリジナルのPythonプログラムでは「
SoftMax関数」にかけてから比較を行っています。数式で表すと式3‐01のようになります。



式3-01 SoftMax関数(Pytorchライブラリの関数)


●conf層の値の「突出具合」を見るためのSoftMax関数

 例えば国語のテストで60点、数学のテストでは7点をとったとします。この際、国語は100点満点、数学は10点満点だったとすると、どちらが優秀な成績かは微妙なところです。

 双方の成績を比較するには、例えば受験者全員のスコアを合計し、自分のスコアをその合計で割る、といった手法が良さそうです(これを
手法Aとする)。

 普通のテストは最低でも0点なのでこの手法で良いのですが、もし
マイナスの点数があったらどうなるでしょうか?全員のスコアを合計したらほとんど0になったり、負の値になったりするかもしれません。それを分母に持ってくるとおかしなことになりそうです。

 SSDのconf層の値には正と負の値があります(*3)。そこで式3‐01のような自然対数の累乗の加算を求めて分母としています。

(*3)conf層はReLU関数を持たないので負の数もある

●全て正の値にしてから平均点と比較

 FPGAはネイピア数(e)の累乗のような演算は得意ではありません。したがって上記
手法Aの改善版を採用します。その手順は以下の通り。

@最低点、最高点を探し、それをmin_d、max_dとする。
A全ての値からmin_dを減算する(最低点が0、すなわち全て正の値になる)。
B全ての値を合計し、それをsumとする。
C(max_d - min_d)をsumで除算する。
D除算した値を閾値と比較する。

 以上により最高点がほかの人より突出しているかどうかが分かります。さらにFPGA向きにするためにC、Dを次のように変えます。

Csumから(おおよその)平均値を求め、それをaveとする。
D(max_d - min_d)を(ave * 2)と比較する。

 (おおよその)となっているのは、Cで平均値を求める際、ビットシフトを使うので正確なものではないからです。リスト3‐12にSoftMax関数の整数版を示します。



リスト3-12 SoftMax関数の整数版

 SoftMax関数を上リストのように変更すれば、ネイピア数の累乗を使わなくてもほぼ同等の目的(conf層の値の「突出具合」を見る)を達成できます。


目次へ戻る