質問: 画像分類するとき、画像サイズが5*5など極端に小さい場合でもCNNを使った方が良いでしょうか。 他に効率の良い方法などありましたら教えて欲しいです。
回答: > > 画像サイズが5*5など極端に小さい場合でもCNNを使った方が良いでしょうか。 > > > CNNを使うメリットは、広大なデータ空間(?)に広がる多種多様な画像に対して、位置が少しシフトしても、色が少し違っても、形が少し違っても、「あーこれは猫か!」と理解させられる柔軟さにあります。その犠牲として説明しきれない不確かさ抱えています。 一方、質問の内容では一例として、5x5、言いかえると(上下左右等の場所間の影響を無視して表現するなら)25次元のデータ分類問題と言い換えられます。本当は上下左右斜め等で関係性があるのかもしれませんが、 > > 多様性はあまりない > > 分類は6種 > > > とのことですので、従来の機械学習を使って分類ができるのではないだろうか、と感じています。 SKLearnの公式の画像を借用すると、 !イメージ説明 分類(classification)に使えるものは左上の薄い赤色の部分の手法が「一般に筋が良いだろう」とされるやり方となります。 詳しい人に「んな、データも見ないで勝手に決めんな!」と言われそうですが、25次元のデータで恐らく非線形の関係があるデータを裁こうとするのであれば、 分類方法 **1. SVM(サポートベクターマシン)を使って分類** こちらの説明が分かりやすいと思います。 架空の2次元のデータをイメージしてください。直線でスパッと割れるのであれば分類しやすいですが、まだら模様のように分布しているデータの分類は直線ではできません。これを「カーネル(二次元のデータ空間を高さ方向にひしゃげて無理やり分離させるイメージです)」で分離して、スパッと線で切ろうぜ、という手法です。 **2. SGD(確率的勾配降下法)を使って分類** 詳細はこちらが分かりやすいと思います。 上の手法と似ていますが、カーネルを近似してSGD SGDをする手法もあります。SVMは「きれいに分かれる線を探す手法」ですが、SGDは「損失(誤差) を一番小さくするパラメータを探す手法」といえます。 **3. バギングを使って分類** こちらが分かりやすいと思います。 バギングは、有象無象のやり方をひとまとめにして、多数決をしてなんだろうか、とする決め方です。1種類の分類方法はクセが強すぎる場合に平均化して分類することがあります。先のSVMもその一つに入れてもよいですし、入れなくてもよいです。 ※SVMを入れると遅くなるので入れない方がよさそうです。 分類の前処理 データの次元同士(25次元の中)で連動する傾向があるのであれば、25種類の生データから6分類するよりも、例えば10種類の生データや5種類の生データから6分類した方がデータ分類の難易度が下がります(シンプルな問題に置き換えられます)。このやり方は次元削減(dimensionality reduction)と呼ばれています。手法としては上の画像の右下部分、特にPCAが便利です。PCAについては、こちらが詳しいです。オプションとして次元を減らしたデータで分類を図るとうまくいくかもしれません。