CNTK; CNNのConv Layer数、ラベル数、モデル利用時の前処理と後処理2020年01月21日 15:21

CNTKのCNNを用いた画像識別。少しずつ、コツを掴みつつあるのか。

1.Conv Layerの数

Conv Layer 3

Conv Layer数3。64x64x1を8x8x16に持っていく。
学習が進むと、大きくLossが下がる箇所がある。ここででは、14000件ほど進んだところ。

Conv Layer 4

Conv Layer数4。64x64x1を8x8x32に持っていく。精度向上や、より多くのラベル数に対応できるようにとの発想だったが。大きくLossが下がる箇所は、25000件ほど進んだところ。

ラベル数は15。2つのCNNの間に、精度の有意な差は見られず。ただ、学習進度が遅くなっただけ。パラメータは他にもいろいろあるので、一概には言えないが、必要以上にモデルを複雑化するのは意味がなく、かえって有害にもなり得る。

2.ラベル数

ラベル数は少ない方が、よい成績を得られそうだが、そう簡単でもない。
今回は、漢字の部品を相手にしているが、「木」に加えて、「大」を加えた方が、精度が上がったりする。データのバリエーションを増やした方が、違いがわかるようになる側面がある。対象のデータの特性次第。

3.モデル利用時の前処理と後処理

漢字の部品単体の認識がそこそこできるようになったところで、対象を広げる。
この時、
・画像の切り出し
・不要な部分の刈り取り
・画像サイズの拡大による正規化
などの前処理を施さないと、結果はノイズだらけに。

圧右下

「圧」の例。画像の右下を切り出し、認識させると、そこそこの精度で「土」を識別する。

圧全体

文字全体だと、「田」と識別。

圧左半

左半分だと、「日」と識別。少し遠目で見ると、そうか、と思えなくもない。
こういった一連の結果を、どう判定して、不適切なものを取り除くかが課題。

圭上半

「圭」の例。画像の上半分を切り出し、「土」を識別。

圭下半

下半分も、「土」を識別。

圭全体

文字全体だと、「王」と識別。横棒を一本無視すれば、そう見えないこともない。
総じて人の識別と比べるとプリミティブなもの。

結果には、まだまだノイズが多い。対処としては、次のようなものか。
・学習データの見直し(形状やバリエーション)
・部品種(ラベル)の追加
・画像の前処理の改良
・結果からのノイズの除去方法の検討
実用に耐えるものができるかどうかは、五分五分。

こんな感じで、機械学習において、モデル構築は作業の一部。目的とする結果を得るには、やることがまだまだある。

機械学習の技術者を育てる、と巷でいうが、どのあたりの技術が課題となっているのか。地味で面倒な作業も多く、十把一絡げで論じてはいけないような。

なお、識別アプリは、UWPでCNTKのライブラリはCPUを使う。画像を69の枠に分割して、処理するが、かなりの時間を要する。エッジ側にもAIアクセラレータが必要、とされるのも道理かと。