2024年10月13日TensorFlow/Kerasを用いて、訓練済みモデルVGG16を使った転移学習の方法について解説します。データセットとしてCIFAR10を使って分類への適用をしてみようと思います。学習済みのモデルを使って新しいモデルの学習を行うことを言います。ディープラーニングでは、大規模なニューラルネットワークを学習させることになるため非常に時間がかかり、データも大量に必要です。このような時に、大量データで既に学習されて公開されているモデルを使うと非常に便利です。転移学習のイメージは以下のような形です。入力後に畳み込み層やプーリング層などの層があり、最後に全結合層の分類器がついているようなモデルだとします。この時、畳み込み層については訓練済みのものをそのまま使用し、最後の分類器の部分を付け替えます。畳み込み層の重みについては凍結して固定した状態にして、新しい分類器部分の重みを訓練することになります。本記事ではTensorFlow/Kerasを用いた転移学習の実装例を紹介しますが、モデルとしてはVGG16というものを使用します。VGG16は、2014年にILSVRCという画像認識コンペティションで2位となったモデルで、決して新しい技術のモデルというわけではありませんが、オンライン講座や書籍等で転移学習の説明によく用いられます。本記事でもVGG16の訓練済みモデルを用いて解説をしていこうと思います。以降では、TensorFlow/Kerasの訓練済みモデルVGG16を用いた画像分類の実装例を紹介していきます。TensorFlow/Kerasでは、tensorflow.keras.applicationsにImageNetという大規模なデータセットで学習した画像分類モデルと重みが使えるようになっています。VGG16の他にもResNet、DenseNet等のより新しいモデルもあります。今回例に使うデータセットはCIFAR10(サイファーテン)というデータセットです。CIFAR10は10種類の画像のデータセットで32×32のサイズで、RGBの3チャンネルを持つデータセットとなっています。各ラベルは以下の対応となっています。以下に、TensorFlow/Kerasを用いた実装例を示します。[3]精度は約54%台と全然高くはありません。今回実行してみた限り、最初(0番目)のデータに対する予測は失敗してしまっています。訓練データのかさ増しや繰り返しによりもっと精度が出るようですが、今回は転移学習の実装方法を示すということで深堀りはしません。上記で紹介した実装例の各部分ごとの内容を説明していきます。SGDまずは、必要なモジュール類をインポートします。VGG16はtensorflow.keras.applications.vgg16からインポートします。データセットとしてはKeras内のCIFAR10がありますのであわせてインポートしています。train_labels[:idx]今回使用するCIFAR10データセットを準備します。読み込みはload_data()で実行できます。訓練データのうち20%を検証データとして抜き出しています。Note【検証データとテストデータを分ける理由】ディープラーニングの場合には、検証データとテストデータを明確に分けます。いうのも、検証データを使ってパラメータチューニングを行ううちに検証データセットを過学習する結果になることがあるためです。これは、情報の漏れと言われます。そのため、最終的には訓練に全く関わっていないテストデータセットで評価します。3))ここから転移学習に関する部分に入っていきます。インポートしたVGG16をインスタンス化します。include_topは、全結合分類器を含めるかどうかを指定するものでTrueにするとImageNetの1,000個のクラスへの分類器となりますが、今回新しい分類器を後で追加するのでFalseとします。3)を指定しています。activation="softmax")(x)ここでは、新しい分類モデルを作成し、VGG16モデルの出力を接続しています。Flattenで平坦化し、その後256ノードの全結合層、ドロップアウト、分類のための10ノードの全結合層といった形で接続をしています。)モデルの作成はkeras.Modelにインプットとアウトプットを指定します。inputsはvgg16.inputで、outputsは先ほど作成した分類器の出力を指定します。model.layersに各層が保存されているわけですが、0~18についてはVGG16に関する層です。この部分の重みは凍結(固定)したいので、for文を使ってtrainableをFalseと設定します。paramsになることが分かります。14,714,688また、keras.utils.plot_modelでモデルの可視化をしています。block5_poolまでがVGG16のモデルで、それ以降が今回個別に追加した部分です。)モデルのコンパイルはcompileを使用します。optimizer、loss、metricsでそれぞれ指定します。(SGD)を選択するのがよいとされています。最適とは限りませんので色々な方法を試してみてください。)モデルの訓練はfitで実行します。今回はエポックは10としましたが、数字は変更して試してみてください。評価用のデータとしてvalidation_dataを指定しています。callbackを使ってチェックポイントとしてモデルを保存しています。save_best_only=Trueとすることで最もよいモデルのみ保存します。保存したモデルを読み込んで使う場合は例えば以下のように使用することができます。plt.show()fitは返却値として、損失関数や指標の推移(history)を返却します。上記の部分では、historyの中に保存されている損失関数(loss)の履歴と正解率(accuracy)の履歴を取得してきて、matplotlibのplotで描画しています。val_xxxとなっているものについては、評価データに対する値になります。{test_labels[0]}")上記の部分はテストデータを使った評価と予測に関する部分です。テストデータを使った評価はevaluateを用いて実行できます。正解率(accuracy)]という形で返ってきます。予測結果はpredictを用いて実行できます。今回のモデルは各文字に対する確率値が計算されます。そのため、予測結果としては確率が最も高い値となるため、argmaxで取得しています。以上が、TensorFlow/Kerasを用いて訓練済みモデルのVGG16を用いた転移学習の実装例です。まとめVGG16という訓練済みモデルを用いて、転移学習する実装例について紹介しました。データセットとしてはCIFAR10を用いています。VGG16は最新のモデルというようなものではありませんが、転移学習のイメージをつかむためにはよく説明に使用されるものとなっています。KerasにはVGG16の他にもResNetやDenseNet等の他の訓練済みモデルも用意されています。色々な問題で訓練済みモデルを用いた転移学習を試してみてもらいたいと思います。ソースコード上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。Tech】Pythonプログラミングガイド本サイトで紹介しているPython入門、応用に関する記事のまとめページです。Python文法の入門から高度な内容、おすすめの書籍についても紹介しています。機械学習等のデータ分析やGUI開発、近年話題の生成AI等のトピックスについても含んでいます。某製造メーカーにてDX推進やシステムの設計・開発・導入をしているシステムエンジニアです。これまでの経験をもとにPythonプログラミング、機械学習などに関する技術情報について発信していきます。