Gin04ghデータ分析業務、予測モデル開発などを担当しています。勉強してきた技術などを適当に書いていければと思います。Python、R、SAS、JavaScript、PHP、Rubyらへんが得意です。).push({});一応、前回の続編的な感じになります。前回は自己符号化器で画像の画素値を次元圧縮し、得られた特徴量を使って類似度計算を行ってみました。今回は、モデルを一から学習するのではなく、転移学習で得られた特徴量...さらに続きとしてやってみました。前回は、花の画像データセットで、VGG16の学習済みモデルを使って特徴量を抽出してみました。今回は表題の通り、タグ付け情報を用いてファインチューニングを行った後に、特徴量を抽出して様子を見てみようと思います。Kaggleデータセットを用います。一緒に格納されています。中身を見るとこんな感じです。pd.read_csv('./flower_images/flower_labels.csv')images各番号は花の種類を指しています。aquilegia.これを教師データとして、学習データセットを作成します。len(dataset)今回はVGG16での学習なので、GPUを使います。前回記事では、extractメソッドによって、画像をVGG16独自のフォーマットに変換する前処理と、順伝播を一気に行いましたが、今回はデータセットを渡すタイミングでは、画像データはGPUに送っておかなければなりません。このあたりのGPU化などの処理はTrainerクラスなどが自動的にやってくれるのですが、そのままですと、GPU化してから順伝播でextractが呼ばれてしまい、GPUの配列データの状態で画像の前処理ができないといったエラーが発生してしまいます。今回は前処理だけ行った状態でデータセットに格納しておきたいのですが、これについては、prepareというVGG16独自の入力フォーマットに変換してくれるメソッドが用意されています。(extractでも、このprepareが中で呼ばれています)順伝播は普通にコールすれば問題ありませんので、モデルの作成時にそのまま呼ぶようにしておきます。次にモデルを作成します。ファインチューニングでは、事前に学習されている重みを使ってある程度特徴量を抽出した上で、解きたいタスクに合わせて、ネットワークを改良します。今回は、fc7層の後ろに、分類したいクラス分に伝播する全結合層を追加してみます。yモデルクラスができたので、インスタンスを作成してオプティマイザーをセットします。alpha*10model.to_gpu(gpu)追加した最後の全結合層のパラメータは普通に学習をさせますが、引っ張ってきたVGG16のネットワーク部分のパラメータは、学習率を抑えて、あまり学習させないようにしています。ここに関しては、色々方法があると思いますし、完全に固定(パラメータ更新をしない)のもアリだと思います。これで準備が整いましたので、学習させてみます。file_name='accuracy.png'))trainer.run()今回、花の画像が200枚程度で、かつ10クラスなので、1クラスにつき20枚程度しかないのですが、ちゃんと学習しているようです。ファインチューニングはこういった、学習データが少ない時にも効果的です。dtype=np.float32)予測ラベルと正解ラベルの混合行列を可視化してみると、ちゃんと予測できていることが確認できます。次に得られた特徴量をt-SNEで圧縮して2次元プロットしてみます。前回よりも良い感じに、似た花が近くにプロットされるでしょうか。pos)target_img.close()plt.figure(figsize=(15,15))plt.imshow(np.array(canvas))plt.axis('off')plt.show()あれ?思ったより綺麗ではない。一瞬思いましたが、よく見てみると、色が違うけども同じ花と思われる画像が近くにプロットされているような箇所が見受けられます。そこで、前回同様に特徴量のコサイン類似度を計算して、類似度が高いものを、ラベルと一緒に並べて表示させてみます。sim_idxs[j]])+'\n'+str(labels[sim_idxs[j]]))axs[j+1].axis('off')plt.show()なるほど...。ラベルの情報が加わったことにより、画像(画素値)による特徴量だけでなく、付与されているラベルの値が近いものがプロットされるようになったみたいです。言われてみれば当たり前ですね。このように、付与されたタグの情報が与える影響が確認できたため、このことから、何を持って「似ている」として、どういった情報を与えるのかを考えなければならないことが分かりました。学習に関してはうまくいっていそうで、安心しました。いうことで、今回はChainerでファインチューニングを実装してみました。今回のソースコードは下記にあげております。https://github.com/Gin04gh/kaggle/blob/master/datasets/Flower_Color_Images/FinetuningVGG16.ipynb移設&少し更新しました。https://github.com/Gin04gh/datascience/blob/master/kaggle_dataset_flower_color_images/finetuning_vgg16.ipynb近い画像のものが、という意味では、確かに同じ種類の花が出るようにはなりましたが、その他の画像系タスクでも、こういったファインチューニングをどんどん試してみたいですね。今回はVGG16でしたけども、他の学習済みモデルでも、どういった実装や挙動になるか、動かしてみたいです。追記(2018-04-04)他の学習済みモデルの使い方もまとめてみました。).push({});画像系の深層学習では、学習済みモデルの重みを利用する「転移学習」や「ファインチューニング」と呼ばれる手法がよく利用されます。コメントをキャンセルメールアドレスが公開されることはありません。・掲載されている広告について当サイトでは、第三者配信の広告サービス(Googleアドセンス)を利用しています。使用することがあります。Googleアドセンスに関する詳細やこのような情報が広告配信事業者に使用されないようにする方法については、こちらをご参照ください。・使用しているアクセス解析ツールについて当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。このGoogleアナリティクスはトラフィックデータの収集のために『Cookie』を使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。『Cookie』を無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。この規約に関して、詳しくはこちらをご覧ください。