TCAVの日本一わかりやすい解説

今回は, TCAV (Testing with Concept Activation Vectors)について詳しく&わかりやすく解説していきます.

タイトルを世界一にしようかと思いましたが, 日本語の記事なので日本一としました (日本一というのもあくまで主観的な見解です).

TCAVとは

一言でまとめると

TCAVは, 画像分類に対して, あるConcept (人間が簡単に理解できるような概念)があるクラスを予測する際にどの程度重要であるかを判断する手法である.
→ → わかりやすく → →
画像分類するときにConcept (人間が簡単に理解できるような概念)をどれだけ重要視するかがわかるようになった!

Conceptとは?

本文では, "human-friendly concepts", "high-level concepts that humans easily understand"と記述されているため, Conceptとは「人間が直感的に理解できる何らかの概念」と表現するすることができます. より平易に説明すると, その言葉を聞いたときに, ほとんどの人が同じようなイメージを持つことができるものがConceptです.

本文で具体例として, 模様 (ストライプ, 縞模様, ドット柄)が挙げられており, 評価実験では, 色や人種などをConceptとして用いています.

既存研究に比べて優れているところ

予測に対する説明性の手法は非常に多く提案されていますが, それらと比較してTCAVが特に優れている点は以下の2点であると考えています.

  1. Conceptベースな説明法の獲得 (⇆ Pixelベース)
  2. あるクラス全体を同じ指標で評価可能 (Classベース) (⇆ Instanceベース)

これまでの説明方法は以下の図ように, ある予測に対して, どのピクセルが重要かどうか (Pixelベース)な説明方法が主流でした (色が白くなっているところが予測に重要). その一方でTCAVは, Conceptベースな説明法を提案しました.

また, 以下の図のように, Instanceベース (各サンプルについて説明を行う)ではなく, あるクラス全体に説明を行う(Classベース)ことで, より一貫性のある説明ができるようになりました. ここでClassベースな説明とは, 例えばシマウマの一つ一つの画像に対して説明を行うのではなくて, シマウマというクラス全体で1つの説明を行うということです (e.g. シマウマクラスは縞模様が重要である).

f:id:munemakun:20200523153727p:plain
Original image and Saliency Maps [1]

Conceptの重要度の求め方

Conceptの重要度の求め方の概要は以下の図のようになります. これからこの図について説明していきます.
f:id:munemakun:20200523155309p:plain
Testing with Concept Activation Vectors

TCAVは, 訓練済みモデルの予測に対するConceptの重要度を計算します (Post-hoc). つまり訓練済みモデルが重要度を計算するために必要です (あたりまえ). 重要度の計算方法の前に, 入力として必要なものを考えてみます. 入力は以下のようになります (アルファベットは上記の図と対応しております). ここからわかりやすいように, あるクラス=シマウマ, あるConcept=縞模様として具体例も同時に考えていきます.

  • (a) あるConceptを持つデータセット + あるConceptを持たないランダムなデータセット (e.g. 縞模様画像のデータセット+縞模様を含まない適当なデータセット)
  • (b) あるクラスのサンプル (シマウマの画像データセット)
  • (c) 訓練済みモデル \displaystyle f ※ (シマウマ, ウマ, ...を予測するネットワーク ※シマウマクラスが含まれていれば多クラスでも良い)

重要度の計算方法は, 大きく分けて3つの工程から構成されます.

  1. あるクラスに対して, 各サンプルのConceptの重要度 (Sensitivity)を求める. (e.g. シマウマクラスの各データに対して縞模様の重要度を計算)
  2. あるクラスに対するConceptの重要度を求める (e.g. シマウマクラス全体に対して縞模様の重要度を計算)
  3. 統計的仮説検定 (Two side t test)を用いて意味のある重要度かどうか検定して, 意味のある場合は, 重要度を出力 (意味のない場合は何も出力しない)

各サンプルベースの重要度を求めた後に, その結果をまとめてあるクラスの重要度を算出するようなイメージです. 3の工程については, 後ほど詳しく説明します.

重要度 (Sensitivity)の算出

ここでは, 重要度を定義します. ここで, 訓練済みモデルについて, (c)のように, 入力→中間層 \displaystyle l : \displaystyle f_l, 中間層 \displaystyle l→出力 : \displaystyle f_{l,k}と表します.

まずは自然言語で重要度の定義を行います.

Conceptの重要度 (Sensitivity)Class kのサンプル xにおけるConcept Cの重要度 \displaystyle S_{C,k,l} (x)とは, 潜在空間 \displaystyle f_l内で, Class kの入力画像の特徴量 \displaystyle f_l(x)を微小にあるConcept方向に変化させたときに, Class kの予測確率の変化率である.
これをより平易な言葉で説明すると, 例えば, シマウマの画像に対して縞模様具合 (シマシマ度?)を高めたときに, どれだけ予測器がシマウマと分類しやすくなったかがシマウマの縞模様の重要度になります.

これを数式で定義すると, 以下のようになります (e). ここで, Concept C方向のベクトルを\displaystyle v_C^lとします.
\begin{eqnarray}
S_{C,k,l} (x) &=& \lim_{\epsilon \rightarrow 0} \frac{h_{l,k}(f_l(x)+\epsilon v_C^l) - h_{l,k}(f_l(x))}{\epsilon} \\ \nonumber
&=& \Delta h_{l,k} (f_l(x)) \cdot v_C^l
\end{eqnarray}

以上より, 工程1 (各サンプルのConceptの重要度算出)が達成されました. 工程2を求めるために以下を行います.
\begin{eqnarray}
&&\mathrm{TCAV_Q}_{C,k,l} = \frac{|\{x \in X_k : S_{C,k,l} (x) > 0 \}|}{|X_k|} \\ \nonumber
&&where X_k~is~all~inputs~with~that~given~label
\end{eqnarray}

つまり, Class kの全ての画像に対してSensitivityを計算して, そのsensitivityが正になったものの割合をTCAV Score \displaystyle \mathrm{TCAV_Q}_{C,k,l}とします.

以下の図は潜在空間が2次元の場合で単純化したときの計算方法です.

f:id:munemakun:20200523215719p:plain


Concept方向のベクトル (Concept Activation Vector)の求め方

計算方法は示しましたが, Concept C方向のベクトル\displaystyle v_C^lの求め方がわからないので計算することができませんよね. 次に実際に\displaystyle v_C^lをどのように求めるかを説明します. ここで, \displaystyle v_C^lをConcept Activation Vector (CAV)と呼びます.
(a)のデータセットを用いて計算します. 求め方自体は非常に簡単で, Concept Cを持つデータセットとConcept Cを持たないランダムなデータセットの線形分離を考えて, その分離平面の法線ベクトルが\displaystyle v_C^lとなります(d). これでTCAV Scoreを計算することができるようになりました (工程1, 2). ここで, TCAV Scoreは訓練済みモデル・Concept set (Conceptを含むデータセット)・Random set (Conceptを含まないデータセット)が与えられたら計算可能なので本文では, 便宜上, 関数\displaystyle {TCAV_Q}_{k,l}(f,C_1,C_2)と表現します.

最終的なTCAV Scoreの算出 (平均値+T検定(意味があるScoreかどうか検定))

CAVは, Concept set (Conceptを含むデータセット)とRandom set (Conceptを含まないデータセット)の線形分離によって求まります. つまり, Random setの選び方によって, CAVは大きく異なります (実装コードでは, Random setはImagenetのランダムなClassのデータセットとしている). そこで, CAVを安定させるために, 複数のRandom set (\displaystyle Rand_1,Rand_2,\cdots,Rand_m)を使用して, 求められたTCAV Scoreの平均値を最終的な重要度として使用します (評価実験では500セット).

\begin{eqnarray}
&&\mathrm{TCAV}_{C,k,l} =\frac{1}{m} \sum_{i=1}^m {TCAV_Q}_{k,l}(f,C,Rand_i)
&&where~ m~is~number~of~Random~set.
\end{eqnarray}

f:id:munemakun:20200523220945p:plain

Random setの選択方法によりCAVは大きく変化して, TCAV Scoreも大きく変化します. つまり, Random setの選択方法によって無意味なCAVが学習されて, 無意味なTCAV Scoreを出力される可能性があります. そこで, 意味のないTCAV Scoreを検定によって排除します (工程3). ここで, 無意味なTCAV ScoreをRandom sets同士によって得られるCAVによって算出されるTCAV Scoreと定義します (e.g. \displaystyle {TCAV_Q}_{k,l}(f,Rand_1,Rand_2)).

得られたTCAV Scoreが無意味である場合, 値を出力しません. 無意味なTCAV Scoreかどうか判別するために, 以下に定義する集合 \displaystyle Set_{Concept},Set_{Rand}で両側T検定を行います.

\begin{eqnarray}
Set_{Concept} &=& \{{TCAV_Q}_{k,l}(f,C,Rand_1), {TCAV_Q}_{k,l}(f,C,Rand_2),\\&& {TCAV_Q}_{k,l}(f,C,Rand_3), \cdots \} \\
Set_{Rand} &=& \{ {TCAV_Q}_{k,l}(f,Rand_1,Rand_2), {TCAV_Q}_{k,l}(f,Rand_1,Rand_3),\\&& {TCAV_Q}_{k,l}(f,Rand_2,Rand_3), \cdots \}
\end{eqnarray}
ここで, 暗黙の仮定として, Random set同士のCAVおよびTCAV Scoreは意味のないスコアであるとしています. そして, 帰無仮説は「Random set同士のTCAV ScoreとConcept setとRandom setのTCAV Scoreの平均値に有意な差がない」となります. 最終的なTCAV Scorは平均値を使うので, 母集団が正規分布に従っているという仮定を満たしているかということは, 考慮しないとすると, T検定を行う妥当性はあると考えらます.

よって, 帰無仮説が棄却される (Random set同士のTCAV ScoreとConcept setとRandom setのTCAV Scoreの平均値に有意な差がないと言えない)場合, Concept setとRandom setのTCAV Scoreの平均値は (Randomと比べて)意味のある値であるとして, TCAV Scoreの平均値を出力します. その一方で, 帰無仮説が棄却されない場合は, Concept setとRandom setのTCAV Scoreの平均値は (Randomと比べて)意味のない値であるとして, 何も出力しません.

つまり, 検定によって, できるだけ無意味であると思われるようなTCAV Scoreを排除しているということになります.

Conceptの相対的な比較 (Relative TCAV)

ここで, Concept同士に何らかの関連がある (茶髪 vs 黒髪)場合は, Conceptの相対的な比較が可能なRelative TCAVを使用します. 手法自体は, 至ってシンプルで, 先ほどTCAVで用いていたRandom setをConcept setに置き換えるだけです. つまり, Concept set同士の比較になります.

具体例を考えます. 比較したいConceptを{茶髪, 黒髪, 白髪, 金髪}として, 茶髪のConceptの相対的な重要度が知りたいとします. その場合は, 以下の集合 \displaystyle Set_{own},Set_{another}を用意して, T検定を行い棄却された場合に, \displaystyle Set_{own}の平均値を出力します.

\begin{eqnarray}
Set_{own} &=& \{{TCAV_Q}_{k,l}(f,茶髪,黒髪), {TCAV_Q}_{k,l}(f,茶髪, 白髪), \\&& {TCAV_Q}_{k,l}(f,茶髪, 金髪)\} \\
Set_{another} &=& \{ {TCAV_Q}_{k,l}(f,黒髪, 白髪), {TCAV_Q}_{k,l}(f,黒髪, 金髪),\\&& {TCAV_Q}_{k,l}(f,白髪, 黒髪), \cdots\}
\end{eqnarray}

※ TCAVに比べて極端にSetのサンプル数が少なくなることを防ぐために, Conceptの各データセットの一部を除去するなどをしてデータセットを水増しします (Githubのissueで言及).

評価実験

以下はImagenetで事前学習済みのGoogleNetとInceptionV3に対する各層でのTCAV Score (縦軸)です. アスタリスクがついているところは, T検定によって棄却されたTCAV Scoreなので, 値を0としています.
左図では, ピンポンボールという予測に対する人種のConceptのスコアです. 人種によって大きく偏りがあることがわかります (TCAV Scoreの計算方法上, スコアが0.5上回ったときが重要なConceptであると判断して良いでしょう). また, 右図では, シマウマの予測に対するジグザグ模様, 縞模様, ドット模様の重要度です. 縞模様のスコアが他の模様に比べて大きいことがわかり直感的に正しそうな結果が得られました.

f:id:munemakun:20200523225532p:plain

他にも興味深い実験を行っているので気になる方は論文の方を読んでみてください.

解説は以上となります!長くなってしまいましたがここまで読んで頂きありがとうございました!

参考文献

[1] Karen Simonyan, Andrea Vedaldi and Andrew Zisserman. Deep Inside Convolutional Networks: Visualising Image Classification Models and Saliency Maps. arXiv:1312.6034, 2013.

.pbを解凍して全ノード名を記述したテキストファイル生成

.pbを解凍して全ノード名を書き込む

今回は, どちらかというと備忘録です.
個人的にNetworkの全ノード名を知りたかったので, テキストファイルに記述するような関数を作成しました.

writeTensorsName(pb file Path, Output text file Path)
→ Networkの全ノード名が記述されたText file

# .pbファイルをロードしてテキストファイルにネットワークの名前を書き込む
def writeTensorsName(pb_file, txt_file):
    # read pb into graph_def
    with tf.gfile.GFile(pb_file, "rb") as f:
        graph_def = tf.GraphDef()
        graph_def.ParseFromString(f.read())

    # import graph_def
    with tf.Graph().as_default() as graph:
        tf.import_graph_def(graph_def)

    # print operations
    path = pathlib.Path(txt_file)
    with path.open(mode='w') as f:
        # for op in graph.get_operations():
        #     f.write(op.name+'\n')

       for op in graph.get_operations():
           for t in op.values():
                f.write(t.name+'\n')

writeTensorsName('model.pb', 'model_name.txt')

KerasのPretrained Modelをpbファイルで保存してTensorflowで解凍する (Tensorflow 1.15)

もともとImageNetで事前学習したモデルをTensorflowで使用したかったのですが,
Tensorflowの事前学習済みモデルの解凍方法が難しい (ビルドを失敗した) & Tensorflow 1.xの記事が少なくて苦労しました...

今回は, Kerasで事前学習したモデル (Pretrained model)をpbファイルで保存してTensorflow上で解凍するための操作を行いました.


事前学習モデル取得からpbファイル作成(1~3)までをスクリプトにまとめましたのでよろしければご覧下さい.
github.com

1. バージョン確認 & 事前準備

Tensorflow 1.15.2で行います.

import tensorflow as tf
print(tf.__version__)

1.15.2

また, tensorflow (r1.15)のfreeze_graph.pyを使用するのでcloneします.

git clone -b r1.15 --single-branch https://github.com/tensorflow/tensorflow.git


2. Kerasで事前学習済みモデルを保存 (ckpt)

Kerasの事前学習済みモデルは以下から確認することができます (ここで自分でデータセットを用意して学習しても構いません).
Applications - Keras Documentation
事前学習済みモデルを読み込む or 自分でデータセットを用意してモデルを訓練した後に, .ckptファイルで保存します.

import tensorflow as tf
# from keras import backend as Kでも動作する
from tensorflow.keras import backend as K

IMG_HEIGHT = 299
IMG_WIDTH = 299

# モデルをロード (Imagenetで事前学習済みのInceptionV3をロード)
model = tf.keras.applications.inception_v3.InceptionV3(include_top=True, weights='imagenet', input_tensor=None, input_shape=(IMG_HEIGHT,IMG_WIDTH,3), pooling=None, classes=1000)

# outputのノード名が必要なのでprintして確認する
print(model.output.op.name)

#ファイル名を.ckptとしてモデルを保存
saver = tf.train.Saver()
saver.save(K.get_session(), 'frozen_model.ckpt')

predictions/Softmax

ckpt.meta, ckpt.data-00000-of-00001 (data-以降の記述は異なる場合がある), ckpt.indexの3種類のファイルが作成されるはずです.
1つだけの.ckptというファイルが作成されるわけではないので注意して下さい.

3. ckpt → pbに変換

cloneしたfreeze_graph.pyをオプションを指定して実行するとpbファイルが得られます.

  • --input_meta_graph = frozen_model.ckpt.meta (2で作成したファイル)
  • --input_checkpoint = frozen_model.ckpt (2で作成したファイル)
  • --output_graph = frozen_model.pb (出力ファイル名 ※.pbにする)
  • --output_node_names = predictions/Softmax (output ノード名)
  • --input_binary = true
python tensorflow/tensorflow/python/tools/freeze_graph.py --input_meta_graph=frozen_model.meta --input_checkpoint=frozen_model.ckpt --output_graph=frozen_model.pb  --output_node_names=predictions/Softmax --input_binary=true

4. Tensorflow上でpbファイルを解凍する

以下の操作を行うことで, 訓練済みモデルのgraphがdefault_graphに追加されます.

# pbファイルのあるディレクトリ
model_dir = ''

with tf.Session() as sess:
    with gfile.FastGFile(os.path.join(model_dir, 'frozen_model.pb'), 'rb') as f:
        graph_def = tf.GraphDef()
        graph_def.ParseFromString(f.read())
        
        _ = tf.import_graph_def(graph_def, name = '')




.h5ファイルをpbファイルに変換したい場合は以下の記事がわかりやすいのでおすすめです.
keras_to_tensorflow - Qiita

エルゴヒューマンプロを手に入れた

Ergohuman PRO ottoman (オットマン内臓モデル)

自粛生活がしばらく続きそうなので, 大人気のオフィスチェアであるエルゴヒューマンプロ オットマンを購入しました.
しかし, 皆さん考えることは同じでAmazonを始めどこを探しても在庫が無く, 問い合わせてみると少なくとも2ヶ月以上かかるとのことだったのでヤ○オクで落札しました.

僕の買ったものは2年ほど使用していましたが, 目立った傷はなく状態が良いものでした (即決価格75000円).
椅子にしては高いと思うと感じる方もいるかもしれませんが, 僕が感じた最大の魅力はカスタマイズ性の高さです.

f:id:munemakun:20200507172230j:plain:w600


自分にフィットする最大限のカスタマイズが可能

カスタマイズ性能が非常に高いので, 自分にあった調整が可能です.

特にアームレスト調整の自由度が高いことと座面の前後調整があることが嬉しかったです.
他の椅子に比べて座面が55cmまで上がることは地味に嬉しかったです.


  • ヘッドレスト 高さ&角度調整
  • 背もたれ 高さ調整
  • アームレスト 高さ&角度&前後&左右&調整
  • 座面 高さ&角度&前後調整

f:id:munemakun:20200507184822p:plain

購入を検討している方は, 中古で購入するという手段もあるので是非ご検討ください!

CyberAgentでインターンした話 (CA Tech JOB)

CyberAgentインターン体験記第二弾です!
2020/02/06~2020/02/28までAI事業本部でデータサイエンティストとして勤務を行いました.

CA Tech JOBとは?

CA Tech JOBは約1か月間, 実際の社員と同じように実務経験をする就業型インターンシップです (時給1500円~2500円). 要求されるレベルとしては, 前回の記事で紹介したCA Tech Challenge (AbemaTV hack)よりも高いです.
合格までの流れとしては, ES提出→人事の方とオンライン面接→現場のエンジニアの方と面接という流れです.
僕は, エンジニア面接の時に都内で予定があったので, 現地で面接を行いました.
基本的に, 1つの部署にエンジニアとしてプロジェクトに関わるといった形になります.
部署については人事の方との面接で, 僕自身の適性ややりたいことを照らし合わせて部署を決めていきました (AI事業本部の中のAirTrackという部署で勤務することになりました).

AirTrackとは?

AirTrackとは位置情報を活用した広告配信を行う部署です.
広告の配信のシステムの中でDSP (Demand Side Platform)という役割を担っています.

※ 余談ですが, 僕の従兄弟が勤務しておりましたw

実務内容について

内部情報を多く含むので, 全てをお話しすることはできませんが, 興味がある方はCyberAgentのインターンブログを書いたのでそちらをご覧ください!

※ 集合写真の中で僕の従兄弟がいるので, もしよかったら探してみて下さい

cyberagent.ai

インターンを終えて

実際にプロジェクトに関われたことと, 社員さんと同じ立場でミーティングを行えたことは自分の中で非常に大きな経験でした.
インターンを過ごした中で多くの人と関われたことも良い経験となりました.
特にメンターさんにはめちゃくちゃお世話になりましたm(__)m

f:id:munemakun:20200423235515j:plain

特におすすめだと思う人

他社で実務経験を積んで, サイバーエージェントの業務に興味のある方にはおすすめです.
やはり, 就業型なので実務経験がこなせるレベルに達していないと参加は厳しいかもしれないですが, 興味がある方は是非ともチャレンジしてみて下さい!

小言

近々広告配信の仕組みについて学んだことをまとめるつもりですので, しばしお待ちを...

CyberAgentでインターンした話 (AbemaTV Hack)

久しぶりの投稿です!
少し前の話になりますが,
2019年9月にCA Tech Challenge AbemaTV Hack -データコンペ編-
に参加したのでその話をまとめさせて頂きます.
もし良かったらご覧ください!

AbemaTV Hackとは?

AbemaTVという動画配信サイトから得られた実データを用いた2日間の分析コンペです. 参加者同士で主に分析精度を競うといった内容となっています.
僕が参加した時は, 1日目は個人で分析精度を競い, 2日目は参加者同士でチームを組んでチームとしての精度を競うといったものです.

www.cyberagent.co.jp

参加までの経緯

合格までの流れ

f:id:munemakun:20200423223926p:plain:w500

夏休み中に短期のインターンを探している時に, CyberAgentで2日間のデータ分析コンペがあることを知ったので, これは丁度良いと思いすぐにESを提出しました.
その後は1度のオンライン面接のみで比較的すぐに合格が決まりました.

遠方の人は宿泊可能

期間が2日間で遠方から通うのはなかなか辛いだろうとのことで, 地方に住んでいる人は開催場所の渋谷近辺のホテルを手配してくれるとのことでした.
ただ, 自分の居住地である茨城は宿泊を認めてくれるかの際どいラインで, 会社によっては, 宿泊を認めて頂けない場合も多くありました (交通費は出すから頑張ってねみたいな感じ).
ただCyberAgentはつくば住みの人も宿泊対象になるとのことだったので, 見事宿泊することができました!感謝です... m(__)m

↓宿泊場所は渋谷区のアパホテルでした
f:id:munemakun:20200423214627j:plain

開催当日-1日目-

f:id:munemakun:20200423225426p:plain

コンペ開始まで

参加者は約30人ほどいて, 大きな部屋の中に5~6人テーブルが5つほどありました. 初めにテーブル毎に自己紹介をした後に, 分析テーマおよび使用するデータに関する説明を受けました.
その後に分析に必要な環境構築を行いました. 環境構築は自分のPC上で行いましたので自分のPCを持って行った方が良いと思います (持ってなかったら事前に相談した方が良いかも).

コンペ中の様子

1日目は個人戦といっても参加者同士で自己紹介を行っていることもあり, 話しやすい雰囲気でした.
AbemaTVでデータサイエンティストとして働いているメンターさんにも疑問点やわからないことを質問しても良いとのことでしたので, メンターさんに気軽に質問できる環境でした.
僕自身は疑問に思ったことが割とあったので結構質問しましたし, 参加者同士でお喋りしながら分析してたので楽しかったです.
メンターさんもたまにこちらの様子を見に来てコミュニケーションを取ってくれました.

ちなみにスクリーン上に順位が表示される形式になっていました (BaselineとしてAutoMLで学習したモデルのスコアも).

チーム発表

2日目はチーム戦で, 僕と組んでくれる人はいるのかとオロオロしていましたが, 参加者同士でチームが決められるわけではなかったので少しほっとしましたw
その後, チーム毎で集まって次の日に向けて作戦会議を行い, その日は終了しました.

↓コンペ会場(上の方の階)からの眺めは最高でした
f:id:munemakun:20200423221044j:plain

開催当日-2日目-

f:id:munemakun:20200423223934p:plain

コンペ中の様子 (チームを組んでみて)

2日目はチーム戦だったので, 1日目でどのようなデータか把握して自分のやりたいことができた上で, 2日目にチームを組んだので, 意見も出やすかったし, 他の人がどのようなことを考えているのかたくさん聞くことができてとても良かったです.

コンペ終了後

コンペ終了後には, 社員さんによる分析課題の解法解説がありました. その解法で行った精度が参加者スコアよりも圧倒的に高くてさすがだなと思いました. その解法は, 実際に運用しているアルゴリズムであるようなので, そのような貴重な手法を聞けて, 個人的にめちゃくちゃ大きな収穫でした.
夜には表彰式と懇談会があり, 社員さんや参加者同士でいろいろお話ができて楽しかったです.

まさかの出来事

全てのイベントが終了して, 帰宅しようとしたところ, アベマタワーズの1階にはラジオ配信する場所があり, 建物の外から配信風景をみることができるのですが, 夜にも関わらず, 凄い人だかりができていて何があったのかと思ったら
なんと!あの超有名俳優○○○○がラジオ配信を行っていました!(誰だよw

最後に

特におすすめだと思う人

Kaggleなどのデータセットで前処理→訓練→テストデータ推論までの流れを一通りできれば十分参加要件を満たしていると感じています.
特にメンターが非常に親切なので, あんまりコンペに参加したことないけど, 成長したいと思っている方は丁度良いと思います!
実データを触れることができるので, Abemaのデータに興味がある方もおすすめです!

-小言-

コンペに参加すると知り合いがどんどん増えて, 次第にコンペに参加すると必ず一人は知り合いがいる状況になる現象に名前を付けたいですw


今年度は, オンラインになる可能性もあると思いますが, 是非興味のある方は参加してみて下さい!

This Looks Like That: Deep Learning for Interpretable Image Recognition徹底解説 (NeurIPS 2019)

XAIに関する論文を読んだのでまとめてみた

NeurIPS 2019に採択されたXAI (Explainable AI)に関する論文 (This Looks Like That: Deep Learning for Interpretable Image Recognition)です.
アイディアは非常に面白いので是非目を通して頂けると嬉しいです.

リストの中のリストを取り出す

2重のリストをリストに変換

pythonで作業をしているときに, 意図せずに以下のような2重のリストになってしまう経験もあると思います.
[[1,2],[3,4,5],[6,7,8,9]]
これだと何かと不便なので, リストに変換したいと思います!
[[1,2],[3,4,5],[6,7,8,9]] → [1,2,3,4,5,6,7,8,9]

以下のようにfor文のリスト内包表記を使えば簡単に変換できます.

lst = [[1,2],[3,4,5],[6,7,8,9]]
new_lst = [b for a in lst for b in a]
# new_lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]

2つのfor文が書かれていますが, 例えば, 最初のfor文で[1, 2]が取り出され, 次のfor文で1, 2が取り出されています. これを繰り返すことで, リストが完成します.
以下の図のようなイメージを持って頂ければ大丈夫だと思います.

f:id:munemakun:20190608165031p:plain:w400