やること
準備が長かったですが、いよいよケーキ画像のクラス分類を行います。
環境とコード
WinPython3.6をおすすめしています。

ニューラルネットモデル
ここでは基本に則って、「畳み込み+プーリング」によって画像の解像度を半減しながらチャンネルを増やす方法を採用します。10クラス分類なので出力層は10ユニット、活性化関数はsoftmaxにすることで、10ユニットが合計1の存在確率になります。

プログラムを実行する
配布されたプログラムを実行すると、まずニューラルネットモデルが表示されます。

CPUやGPUがうなりを上げます。

結果
「学習曲線」と呼ばれる結果が出てきました。およそ正答率70%くらいまで上がりました。通常、学習曲線はLoss(教師との誤差)を縦軸に取ることが多いですが、クラス分類問題の場合はAccuracy(正答率)を見たほうがわかりやすいです。学習後は、重みとバイアスが自動的に保存されます。

はじめてのケーキを分類する
testフォルダに、学習には使用していない新規のケーキ画像を10枚入れました。ニューラルネットはこれらの画像は一度も見たことがありませんが、どのケーキと判断するでしょうか。学習曲線では正答率70%くらいでしたので、7枚くらいは正解してほしいところです。プログラムを実行すると、保存したモデル・重み・バイアスが読み込まれ、testフォルダ内のすべての画像に対して分類が行われます。

結果
名店から選りすぐった10種のケーキのうち7種類が正解でした。期待通りですね。素人がノートパソコンのCPUで、最低限のテクニックだけでやったにしては、良い結果だったのではないでしょうか。


余談
ダロワイヨの「オペラ」はチョコケーキですが、抹茶ケーキやシフォンケーキと間違ったようです。実はこれには理由があります。教師データを覗いてみると、チョコケーキにも四角くて層があるものが存在しますが、抹茶ケーキにも同様の形状のものがあります。オペラのように層がはっきりしているものは、むしろ抹茶ケーキのほうに多いようです。機械は、「茶色であること」よりも「四角くて層がはっきりしていること」に着目したのかもしれませんね。