機械学習SEの取り組みログ

pythonを使ったいろんな取り組み(kaggleだったり)を紹介していきます.

kaggle python 画像認識

【kaggle】「SIIM-ISIC Melanoma Classification」コンペのデータを用いてEfficientNetとResNetの性能比較をしてみる

投稿日:2020年7月7日 更新日:

本記事の概要

kaggleで2020/07/07現在開催中のSIIM-ISIC Melanoma Classification(画像認識コンペ)に最近注力しています.
画像認識ど素人ですが,以下の2つのモデルが単体のCNN(画像認識に特化したモデル)としては優秀であることまでは把握しました.

  • EfficientNet(2019年5月にGoogle Brainから発表されたモデル.)
  • ResNet(Microsoft Researchが開発.ILSVRC(画像認識コンペ)2015優勝モデル.)

これらのモデルについてどのような記事を見て理解したのか,また実際にコンペのデータセットに適用した結果はどうだったのかを述べていきます.

本記事の対象読者

  • 【条件】CNNに関する基本的な知識(畳み込み層,プーリング層,全結合層についてなど)がある.
  • 【モチベ】EfficientNetについてどのように理解したのかを知りたい.
  • 【モチベ】ResNetについてどのように理解したのかを知りたい.
  • 【モチベ】上記の二つのモデルを実問題に適用した場合の比較結果を知りたい.

ResNetの理解

理解の流れ

以下のような流れで理解しました.

  • 解説記事を見て概要を理解する.
  • ResNetの要素(BottleNeck)について具体的なパラメータ数を確認して有効性を理解する.

概要の理解

Residual Network(ResNet)の理解とチューニングのベストプラクティスという記事がResNetの概要を理解するうえで一番わかりやすかったです.(原論文を読むのがベストなのですが...)
以下の2点がResNetの特徴かと理解しています.

  • より深いCNNを構築できるようにするため,各層の入力情報を出力に加えている.(shortcut Connection)
  • 計算量を少なくするため,1×1の畳み込み層でフィルタ数を少なくし,畳み込みが完了した後に再度1×1の畳み込み層でフィルタ数を復元する.(BottoleNeckアーキテクチャ)

BottleNeckによる計算量削減の理解

機械学習エンジニアなら答えられて当然の問題4問 ~畳み込み層編~というサイトの第3問がBottleNeckによる計算量削減を具体的に理解するうえで役に立ちました.

EfficientNetの理解

理解の流れ

EfficientNetもResNetと同様,わかりやすい解説記事をベースに不明な要素を別記事で補完するような流れで理解しました.

  • 解説記事を見て概要を理解する.
  • EfficientNetを構成する層であるMBConv(MobileNet)について別記事で理解する.

概要の理解

2019年最強の画像認識モデルEfficientNet解説とういう記事を見て概要を把握しました.

解説先の概要にも載っている話ですが,EfficientNetについて以下のように理解しました.

  • CNN系モデルの構造を決めるパラメータとして「広さ」,「深さ」,「解像度(=入力画像の大きさ)」の3つに注目する.
  • 上記の3つのパラメータをうまく調整する方法を考案し,サイズが小さく精度も良いモデルを構築できた.
  • EfficientNetで用いられる層は主にMBConvという層.

MBConvの理解

以下の2つの記事を見て理解しました.

EfficientNetの構成要素であるMobileNetv2のInverted Residual Blockを理解するために,Residual Block(ResNet)depthwise separable convolution(MobileNetV1)をそれぞれ理解する必要があります.基本的には如何に少ないパラメータにしつつ,従来の畳み込みのエッセンスを残すかというアイデアがどんどん出てきます.
両記事とも具体的なパラメータを提示し,どれほど削減できたかを伝えているので理解しやすかったです.

両モデルの精度の比較

利用したデータセット

冒頭でも述べましたが,現在黒色腫の皮膚の画像から悪性かどうかを分類するデータ分析コンペに出場しています.与えられた皮膚の画像について2クラス分類するシンプルな画像認識コンペのため,CNN初心者での私でもそれなりに参加できています.

このコンペのデータセットを用いて,ResNetとEfficientNetの比較を行いました.

データセットの特徴

以下の表に示すように,正例(悪性である黒色腫)のデータが極端に少ないデータとなっています.

正例 32542
負例 584
合計 33126

モデル構造/パラメータ数の比較

pythonのtensorflow.kerasライブラリに学習済みのResNet50があるため,そちらをfine tuningして今回のタスクに適用させました.ImageNetと呼ばれる数万種類のタグが付与された1400万枚ほどのデータセットで学習されたモデルを用いました.
またefficientnetもtensorflow.keras形式のライブラリが公開されているため,そちらを利用しました.こちらもImageNetで学習済みのモデルをfine tuningしました.
EfficientNetB1とresNet50とを比較すると,EfficientNetB1の方が約1/4のパラメータになっています.
EfficientNetB1 ResNet50

学習結果の比較

各モデルで10エポックで学習させました.細かい分析条件は割愛しますが,同条件での結果になります.
(もし細かい分析条件を知りたい!という方がいらっしゃいましたらコメントなど頂ければ幸いです(この記事を御覧だけでもありがたいのですが,お手数おかけします).
各モデルの各エポック(X軸)での以下の2つの性能評価結果をplotした図を貼り付けます.
データ数が少し増えているのは,正例のデータに対して水増し処理を行っているためです.
また,earlystopping処理によって両モデルとも6エポックで終了してます.

  • 訓練用データ33,000件に対するROC AUC score
  • 検証用データ1444件に対するROC AUC score


この結果から,EfficientNetではResNetに比べ早い段階で学習が収束し,またResNetよりも高い精度を出していることが伺えます.
単体のモデルではEfficientNetを利用しておくのが安牌といえそうです.
もちろん,ResNetによる出力もKaggleのデータ分析コンペの終盤によく行われるアンサンブルで活用できるため大事に結果を保存しておきます.

-kaggle, python, 画像認識

執筆者:


  1. y-vectorfield より:

    画像認識技術は枯れた技術になりつつ有ると言われたり、社会実装が最も進んでいる分野と言われたりしていますが、まだまだ発展著しい分野ですね。TFやPyTorchで様々なモデルの実装比較をやってみてベンチマークを取ってみると面白いだろうなと思います。

comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

【自然言語処理】得られたニュース記事をgensim, nattoライブラリを用いてベクトル化する【python】

記事の概要 この記事では,機械学習手法であるdoc2vecを用いてニュース記事を30次元のベクトルで表現した結果について紹介していきます. また記事をベクトル化する過程で,文を品詞ごとに区切る処理(形 …

no image

【2018年10月時点】産経ニュースから経済カテゴリのニュースの情報をスクレイピング【python】

スクリプトの目的・概要 タイトルの通り, 産経ニュース様から経済カテゴリのニュース情報をスクレイピングするスクリプトを書きました. 株価の時系列分析の補足情報として用いることを考えているため, 記事タ …

no image

【自然言語処理】ニュース記事のベクトル表現と株価変動の関係性を可視化する【python】

本記事の概要 以前紹介したニュース記事をスクレイピングするスクリプトとニュース記事をベクトル化するスクリプトで得られたベクトルの各成分のうちどれかが,株価の変動との間に相関があるかどうか調べてみました …

no image

【scikit-learn】Logistic回帰にLasso回帰の正則化項(ペナルティ項)を設定する方法【Python】

概要 (動機)Pythonのscikit-learnライブラリを用いてロジスティック回帰を実施する際,ラッソ回帰のように正則化項を設けて変数選択もしたいと思った. 調べたところ,scikit-lear …

no image

【TensorFlow 2.0】tfrecordファイルに格納されているデータの数を確認するコマンド【Python】

記事の概要 TensorFlow特有のデータ保存形式「tfrecord」で保存したデータセットについて,何件のデータがtfrecordに圧縮されているかを確認する方法を記載しました. 単純にlen(t …

プロフィール


sudot

某IT企業でデータ分析業務をしています.
日ごろの機械学習に関する取り組みを発信していきます.
最近kaggleのexpertになれました.いつかmasterになるのが夢.