テスト用画像による出力結果の検証
前回は200epochで実行していたため、1000epochsを上限としてソースコードを再実行しました。
3回実行した結果は以下の通りです。
結果1 loss: 0.06033502146601677 , acc: 0.8571428656578064 [[0.51802504 0.6025501 1.2425147 ] [0.4857249 0.6114445 1.2474421 ] [0.6278313 0.51824236 0.83752614] [0.6209755 0.41403776 0.63268536] [0.60386395 0.42225987 0.719294 ] [0.69232017 0.46503505 0.7854029 ] [0.68193567 0.49309677 0.77562374]]
結果2 loss: 0.07862301915884018 , acc: 0.7142857313156128 [[0.48814806 0.555198 1.1395972 ] [0.48697 0.5606675 1.1693267 ] [0.6869695 0.46108288 0.9128459 ] [0.6248303 0.46988714 0.64983475] [0.6502897 0.44540572 0.7058172 ] [0.70675755 0.52861613 0.7092963 ] [0.74038106 0.55308616 0.7347918 ]]
結果3 loss: 0.07302295416593552 , acc: 0.5714285969734192 [[0.5122161 0.59197325 1.1409588 ] [0.52777326 0.5382183 1.1450673 ] [0.68004286 0.4690326 0.7596061 ] [0.6853889 0.47074232 0.7588918 ] [0.65935266 0.39122698 0.7436137 ] [0.62058353 0.43708852 0.54561085] [0.6053312 0.40008202 0.5346468 ]]
結果1ではpatience=30のearlyStoppingを設けました。 学習カーブとロスカーブを図1,2に示します。
earlystoppingで止まっていることに加えて、定性的に収束していることが分かります。
この結果1から相対誤差を求めました。図3に示します。
結果2においても結果1と同様にpatience=30のearlyStoppingを設け、相対誤差を求めました。 結果を図4、5、6に示します。
結果3においても結果1、2と同様のことを行いましたので、結果を図7、8、9に示します。
これらの結果から、幅と奥行、高さはおおよそ20~30%の誤差に収まっていましたが、体積になると累積誤差が大きく、相対誤差が100を超えるものが出ていたため実用に耐えうるものとは言えません。
しかし、val_lossやaccの遷移、trainingのloss、accをの値を見ますと、まだ可能性を捨てきることはできません。
現在のモデルに対する考察
この結果から問題点と改善点を洗い出し、精度向上を図りたいと思います。
まずは精度と損失について考察し、達成損失と精度を探ります。
その後はモデルに焦点を当てて問題点・改善点を探り、最後に具体的な改善策と戦略を立てます。
精度と損失について
今回の出力結果にて、学習の検証データによる結果がloss = 0.03086667±0.0014197、acc = 0.95666667±0.01247219と非常に高精度で分散が少なく、安定した結果と言えます。
テストデータによる結果ではloss = 0.07066033±0.00765067、acc = 0.71428573±0.11664236と損失の分散は小さいものの、精度は高くはありません。
このように、検証の損失が低く精度が高いということと、テストデータの損失が小さいことから精度が高く、各辺(幅・奥行き・高さ)を推定していると思われましたが、実際には異なりました。
テストでは精度と出力、各辺との相対誤差に大きなギャップがありました。実際、テストデータによる精度の分散が大きく下がるのに対して、相対誤差は数%程度と各モデルに大きな差はありませんでした。
これは、各出力値の値が統計的平均値になっているものの、個別の各辺の最適値になっていないことが考えられます。
これを裏付けるものとして、各辺の出力に注目します。
今回の出力結果にて値は示してありますが、各ニューロンの出力値が大きくても0.2 mとなっており、実際の教師データは大きくても0.4~1.8 mとなっています。
ここから、出力値のとりうる範囲が小さいことがわかります。
つまり、損失と精度を確認すると、精度が90%を超えて99%に近づかなくては実際の出力値の相対誤差の縮小にはつながらないと考えられます。
では、どのように改善すべきかをここで考察します。
まず、出力値の分散が小さいということは、入力データから各辺の情報が抜き出しにくいことが挙げられます。
入力データは224x224に縮小拡大・変換されて扱われ、これにより入力データが各辺の情報を失っていると考えられるからです。
また、出力データも回帰値ではなく相対誤差が1%程度のone-hot vectorを用いることにより、高精度にできると考えられます。
その他、今までは幅と奥行き、高さを出力してその積で体積を求めていましたが、それぞれに誤差があると累積誤差により誤差が爆発的に増えてしまうため、体積直接出力する必要があると考えられます。
モデルについて
VGG19の全結合層を重ねて学習を行い、全結合層のパタメータ最適化を行いましたが、全結合層のみの検討で良かったのかどうかランダムフォレストなどの決定木を検討していなかったため、アンサンブル学習による検討も必要と考えられます。
また、学習データと検証データ、テストデータの損失・精度にばらつきが大きいため、汎化性能が悪いと考えられます。
このことからより深い層にももう一度チャレンジする必要があると考えられます。
改善策と今後の展望
これまでのことから、以下の変更により精度向上が見込めると考えられます。
変更し易いものから順番に示します。
幅・奥行き・高さの出力ではなく、体積を出力値として学習
- メリット:累積誤差による誤差率の爆発が起こりにくい
- デメリット:出力の情報が少ないため、学習の最適解での収束の内意度が高くなる可能性がある
回帰値を出力するのではなく、one-hot vecの表現にする
- メリット:出力形式が2値のため比較的出力が安定する(通例だと精度向上に寄与する)
- デメリット:予め大きさと小ささに制限をかけてしまうため、想定外に大きいものや小さいものを扱いきれない
入力に画像サイズの情報を付与する(方法は別途検討予定)
- メリット:画像に対する情報量が増えるため、出力が変化しにくくなることを防ぐと考えられる
- デメリット:入力が多くなるため、次元の呪いに引っかかる可能性がある
アンサンブル学習を行う
- メリット:様々な表現系から適切なモデルを精度基準で決めることが可能である
- デメリット:時間と計算コストがかかり、学習・検証アルゴリズムの最適化が必要である