Update 2023.12.19 2023.12.11

Gulli著 CIFAR10 InceptionV3 Fine Tuning
機械学習 ディープラーニング ベストプラクティス
データセットの取り扱いを詳細に示した
ディープラーニング TensorFlow, Kerasのベストプラクティス・教科書

Gulli著 CIFAR10 InceptionV3 Fine Tuningをリファクタリングしたオリジナルです

左側の写真は実物大です。ディープラーニングが注目された2012年ごろのGPUマシンの性能ではちょうどよい大きさだったかもしれませんが,今のGPUマシンの性能では写真はもっと大きくても十分学習が可能でしょう。何よりもaccurasyが格段に上がると思われます。


画像データセット CIFAR10 を一から学習しても正解率を上げられません。学習済CNN InceptionV3 を利用してファインチューニングするのが効果的です。VGG16 に比べて軽くて高性能です。

InceptionV3 は VGG16 と同じで学習済CNNとして Keras にあります。ImageNetのデータセット(1400万画像,2万2千クラス,学習は1000クラス)を高性能GPUを使って長時間(1月ほど?)学習させたものです。ILSVRC はImageNetから1000クラスを抜き出しコンペに提供していました。

Gulli著『直感 Deep Learning』で使うのはImageNetからダウンサイズして抜き出し10クラスにしてあるサブセットの CIFAR10 です。それを InceptionV3 に学習させています。


2020年当時,動作確認済みの.ipynbファイルを3番目に添付・表示しました。現在はこのままではエラーが出ます。学習はできるものの'model.evaluate', 'model.predict'のところでメモリ不足という警告が出て,Webでは'batch_size'を小さくしろというアドバイスがあり,いろいろ試したのですが,どう考えても的外れであり,動作は成功しませんでした。

改善したものを2番目に添付・表示しました。写真のサイズ変換,正規化,one hotエンコーディングなどを class CIFAR10Dataset のメソッドでやっていたのをデータセット読み込みの直後にインデントが0(トップレベル)で実行するようにしました。class CIFAR10Dataset のメソッドの何が悪いのかは判りませんでした。

クラスのインスタンス化とメソッドの呼び出しをコメントアウトしただけで class CIFAR10Dataset は動作しませんがそのまま残してあります。

accuracy は2020年当時は 0.797,今回が 0.839 であり,まだ改善の余地があるので,Webの他記事を参考にリファクタリングすることにしました。

ベースはGulli著のプログラムの骨格をそのまま残しました。ただ付け加えた層のみの学習(特徴抽出という)を止め,'InceptionV3'の上層(出力層側)部分と追加した全結合層(Dense層)の再学習(Fine Tuning)だけにしました。

その accuracy は 0.902 になりました。データセットは 1/3 以下にダウンサイズしています。向上した理由ははっきりとは判りません。


(2023-12-19 Python3.10.9(GPUマシン)で動作確認済み)


(2023-12-11 追記)

◆◆画像分類は実用的にはファインチューニングFine Tuningの一択◆◆

この画像データセット CIFAR10 は比較的小規模の方です。それを比較的小規模のニューラルネットワークで学習しても正解率は上げられません。例えば,AlexNetは全17層,パラメータ8百万個であり,学習は数分のオーダーです。

一方,pre-train は CIFAR10 のスーパーセット ImageNet を InceptionV3 で数日,数週のオーダーで学習しています。InceptionV3 は全312層,パラメータ2千3百万個です。

ファインチューニングは pre-train された InceptionV3 の出力層を CIFAR10 に合わせ,その出力側の上層部を再学習(ファインチューニング)します。

比べてみたら,AlexNetの accuracy は0.5ほど,InceptionV3 のファインチューニングの accuracy は0.8~0.9ほどであり,大きな差があります。

画像分類を実用化する場合,一番の課題は対象の写真を集めることです。Webからクローラー・スクレイピングする方法もありますが,それにしても数百点くらいか?

筆者にも経験がありますが,InceptionV3 の中になさそうな相撲とサッカーの画像にキャプションを付ける課題をやったとき,集めた写真は百枚ほどですが,ファインチューニングで1080を丸1日学習させて,間違いは数枚だったです(エラー率は数パーセント?)。

ファインチューニングのメリットは,accuracy が上がることもちろんですが,それよりも再学習(ファインチューニング)する対象が小規模でよいということです。

◆◆画像の大きさとは何ですか?調べても情報はないです?◆◆

冒頭で写真は実物大ですと言いましたが,写真の実物大ということを聞いたことありますか?これは調べても情報はほとんどないと思いますが,詳しく解説します。撮影対象を実寸大で印刷することとは意味が違いますので注意してください。この方はA4の紙に対象を置き紙の大きさに合わせて撮影しA4の紙に印刷すれば実寸大になります。

同じピクセル数のjpeg, png, bmp, gif などの写真や画像をペイントなどで何も設定しないでプリントするときの画像の大きさは皆同じになることを知っていますか?jpegだけ画像内部に解像度を設定できますがそれでも決まった大きさになることがすなわち実物大ということです。それは1インチ(25.4ミリ)の中に96ピクセルとなります(96dpiという)。

jpegだけはWordやExcellに貼り付けるときだけ解像度に応じた大きさになりますが(デフォルトが72dpi),jpeg単体をペイントなどでプリントすれば解像度に関係なく実物大印刷(96dpi)となります。

冒頭の写真は 32x32ピクセルなので 1/3インチ角(約8ミリ角)であり,見た目と合っていることが判ります。プリントすればピッタリの寸法になること証明できるのですが,コンピュータスクリーンでは画面サイズにより少し大きくなったり小さくなったりします。

注意してほしいのは,写真を写真用紙に印刷するときは実物大印刷ではきれいではありません。写真印刷やポスター印刷の常識?として,1インチ(25.4ミリ)の中に300ピクセル(300dpi)以上必要となります。つまり最低限1/3や1/4以下に圧縮印刷することになります。

写真用紙に印刷するときに圧縮割合を設定することはできないです。写真用紙やハガキの長手は約6インチであり,きれいに印刷するには1800ピクセル必要です。短手が1200ピクセルとして約2M(メガ)ピクセルのカメラやケータイがあればよいことになります。

今どきのカメラやケータイは10~50M(メガ)ピクセルあるので,写真用紙寸法を設定して印刷すれば圧縮割合は十分に小さくつまり dpi は十分に大きくきれいに印刷できます。

調べれば dpi というワードはよく出てきます。が,印刷では 96dpi で決まっているという情報は皆無でしょう(無圧縮・設定なしでは)。それを実物大印刷ということにしましょう。

写真用紙に圧縮印刷することに慣れてしまっているので理解が難しいかもしれません。が,証明写真のように決まったサイズに印刷するときに必要な知識です。このときは写真用紙寸法を設定するのではなく,25%(1/4)圧縮印刷できるアプリを使います。



下の枠に添付のhtmlファイルは「Jupyter Notebook」の.ipynbファイルをhtml化したものでそれぞれのファイル(2020年当時のファイルも)は左上隅からダウンロードできます。

・InceptionV3Finetuning.ipynb:Gulli著のプログラムをリファクタリング

・Gulli_CIFAR10_InceptionV3_FineTuning.ipynb:Gulli著の読み込みデータの加工を改善

・Gulli_CIFAR10_InceptionV3_FineTuning20200401.ipynb:Gulli著のオリジナル


InceptionV3Finetuning.ipynb on Python3 on Jupyter Notebook on GPU

Gulli_CIFAR10_InceptionV3_FineTuning.ipynb on Python3 on Jupyter Notebook on GPU

Gulli_CIFAR10_InceptionV3_FineTuning20200401.ipynb on Python3 on Jupyter Notebook on GPU


トップページに戻る
inserted by FC2 system