update.弱教師あり学習は何を見ているのか?機械学習で分類モデルを学習する際、通常であれば正しくラベリングされたデータを入力としますが、弱教師あり学習では誤ったラベルから学習します。ヒョウ」を分類するモデルを学習するとき、すべての「飛行機」画像に「腕時計」、「ヒョウ」のいずれかのラベルがついている(=誤ってラベリングされている)とします。ヒョウ」画像の特徴を持たない画像を「飛行機」画像と学習します。この学習を実装するには損失関数を工夫します。具体的には、学習で誤りラベルを推論すると損失が大きくなるように損失関数を設定します。通常であれば(正しいラベルがついている場合は)、ラベリングされたクラスを推論すれば損失関数が小さくなりますが、弱教師あり学習ではその逆の処理を行います。詳細は以下論文で論じられているので説明は省きますが、ざっくりイメージとしては入力データは「ラベリングされたものではないもの」と学習している、と考えれば良いと思います。Labels参考に、誤りラベルによる分類モデルの学習が可能であることは、以下で検証しました。https://qiita.com/cvusk/items/66252eb48e89435824f5さて、「飛行機」画像を「腕時計」、「ヒョウ」でないものと学習するとき、分類モデル自体は「飛行機」のどういう特徴を抽出して「飛行機」と分類しているのでしょうか?正しいラベルからの学習であれば、他のクラスにない「飛行機」の形態に反応して「飛行機」と分類するでしょう。「腕時計」、「ヒョウ」ではないものとして「飛行機」を学習した場合、分類モデルは「飛行機」っぽさを学習しているのか、それとも『「腕時計」、「ヒョウ」』でないっぽさを学習しているのか。ヒョウ」の分類モデルを学習し、そのモデルが何を見ているのか、可視化してみようと思います。データCaltech101の一部の画像を用います。ヒョウ」の画像を利用します。これらのクラスを選んだ理由は、いずれも200枚以上と、学習するのに充分な画像数があると判断したからです。ヒョウ」を選びました。「飛行機」の画像は800枚以上ありますが、「腕時計」「ヒョウ」(いずれも200枚程度)とバランスをとるため、「飛行機」画像の中から200枚ずつをランダムに選出しています。Colaboratory(GPU利用)Python3.6TensorflowKerasOpenCVデータを用意するデータはCaltech101でダウンロード可能です。画像自体は.tgzで固められています。解凍すると、画像ファイル.jpgがラベル名のディレクトリに整理して格納されています。639前述のとおり飛行機はもともと800枚以上用意されていますが、今回はそのなかからランダムに200枚を抽出して利用しています。画像サイズはまちまちなのですが、以下の分類モデルにXceptionを使うので、画像はすべて同一サイズ(299*299*3(RGB))に変換しておきます。上記のデータを学習データ80%、テストデータ20%に分割して使用します。正しいラベルで分類モデルを学習する分類モデルはXceptionで学習します。callbacks=[es_cb])KerasであればImagenetで学習したXceptionモデルから転移学習することも可能なのですが、今回は0から学習します。理由としては、弱教師あり学習を誤りラベルのみで学習するためです。正しいラベルのほうも弱教師あり学習に条件を合わせるため、転移学習はしません。正しい分類モデルの学習結果は以下になります。テストデータの正解率:93.75%誤りラベルを設定し、弱教師あり学習で学習する弱教師あり学習ではXceptionモデル自体は正しい分類モデルと同じですが、誤りラベルと損失関数を設定する必要があります。誤りラベルには、「飛行機」は「ヒョウ」、「腕時計」のいずれかをランダムに設定します。「ヒョウ」、「腕時計」についても同様に誤りラベルを付けます。np.random.choice([0,1],1)損失関数は誤りラベルに分類すると損失が大きくなるようにします。目安程度に擬似的なAccuracyの関数も用意します(正しいラベルを使わないので、正しい正解率は計算できませんが)。output)この状態で弱教師あり学習を実施します。len(y_test))誤り分類モデルの学習結果(正しいラベルに対する正解率)は以下になります。テストデータの正解率:91.41%Grad-Camで正しい分類モデルと誤り分類モデルを可視化する正しい分類モデル(model)と誤り分類モデル(cmodel)ができあがったので、これらのモデルが入力画像のどういう特徴に反応しているか、Grad-Camで可視化します。Grad-Camの詳細な理論は以下論文を参照すれば良いと思います。Localization日本語の説明は、以下ブログがとてもわかりやすい説明をしてくれています。ありがたやありがたや。簡単に説明すると、Grad-Camでは入力画像をニューラルネットワークに通し、途中レイヤーで画像のどの部位に反応しているのかをヒートマップで可視化することができます。畳み込みニューラルネットワークでは画像にフィルターをかけることで重要な部位の特徴を抽出します。Grad-Camでは画像の中のどの部位に反応しているのか(特徴抽出しているのか)を可視化します。全体像は以下のような構造になります。論文オリジナルのコードは以下で公開されており、LuaとTorchで実装されています。grad-camKerasで作ったモデルをGrad-Camにかけるコードは以下です。gradcam実装は以下を参考にさせていただきました。ありがとうございます。自分で作ったモデルでいろいろやっていますが、指定したレイヤーの出力を平均して入力画像に半透明なフィルターとして被せています。強く反応している箇所は赤、中くらいは緑、弱く反応している箇所は青になります。出力画像は以下で可視化します。"block14_sepconv2_act")以下に各クラス画像の元画像、正しい分類モデルによるGrad-Cam、誤り分類モデルによるGrad-Camを提示します。それぞれについて、浅いレイヤー、中位のレイヤー、GlovalAveragePooling直前の深いレイヤーでのGrad-Camを出力しています。画像によって多少の差異はありますが、深いレイヤーでは正しい分類モデルによるGrad-Camと誤り分類モデルによるGrad-Camの反応している箇所(緑や赤の部位)に大きな違いがないことがわかります。浅いレイヤー、中くらいのレイヤーでは正しい分類モデルと誤り分類モデルで違った反応をしていることが見て取れます。中間レイヤーの過程は違えど、通常の教師あり学習と弱教師あり学習は、最終的に深いレイヤーで正解画像の特徴を抽出しているようです。分類が間違っている場合なお、間違った分類をしている場合は反応の仕方が違ってきます。以下は腕時計で、誤り分類モデルが間違っているときのGrad-Camです。正しい分類モデルが腕時計の丸いフォルムに収束していっているの対し、誤り分類モデルはフォルムを捉えきれていないようです。次に正しい分類モデルが間違っているときです。同様に、間違っている正しい分類モデルは丸いフォルムに収束していません。最後に今回は「飛行機」、「ヒョウ」、「腕時計」という見た目のだいぶ違う3クラスの分類を教師あり学習、弱教師あり学習で可視化しました。クラス数を増やすと弱教師あり学習の学習が難しくなる(収束しなくなる)ので、今回は3クラスにしましたが、もっとクラス数を増やしたり、似た画像(犬と猫とうさぎか)でのどうなるのか、暇があったらやってみます。「飛行機」「ヒョウ」「腕時計」に「バイク」を加えた弱教師あり学習も試してみたのですが、正解率が60%程度で微妙でした。upLoginユーザーは見つかりませんでした。