機械学習エンジニアがAidemyのコース受講してみた。

#はじめに
今回はAidemyの`AIアプリ開発コース`を受講する機会を頂いたので、ある程度機械学習に経験がある身として、これから機械学習分野に踏み込もうかお考えになっている方、また実際にAidemyで機械学習を学ぼうか悩んでいるかたに向けて、コースの感想などをお伝えできればと思っています。
`企業案件ではありません。`

【目次】

- 前半パート
    - 簡単な自己紹介
    - Aidemyとは
    - そもそも機械学習エンジニアは何をするのか
    - では、AidemyのAIアプリ開発はどうだったのか
    - 前半まとめ
- 後半
    - AIアプリ開発で作成したものについて
    - Datasetについて
    - Dataのサンプル
        - Positive(陽性)
        - Negative(陰性)
    - 事前処理
    - モデルの構造
    - ハイパーパラメータ含む設定
    - モデルの評価
    - 後半まとめ

##前半パート
###簡単な自己紹介
私はカナダで機械学習エンジニアをしております。現在(2021/3)は新型コロナウィルスの影響で日本に一時帰国していますが、今後またカナダに戻る予定です。私が機械学習に興味を持ち始めたのは2017年の年末で、当時は今ほどオンラインコースは目立っていませんでしたが、基本的には`Coursera`で理論的なところから独学で勉強しました。その後カナダで、Bootcampと呼ばれるプログラミングスクールに通いましたが、その時にはすでにある程度機械学習の知識はあったと思います。その後はカナダの音声処理を行うスタートアップで機械学習エンジニアとして働いていました。

###Aidemyとは
Aidemyは日本語で機械学習を勉強できるオンラインのプログラミングコースを提供する企業です。他にもいくつか有名どころのオンラインのプログラミング学習サイトはあります。2021年3月現在ではユーザー数10万人を突破されているみたいで、`テレビ朝日「あいつ今何してる？」`に代表取締役CEO石川氏も登場していました。

###そもそも機械学習エンジニアは何をするのか
これは私の経験をもとにした話にはなってしまいますが、スタートアップで働いていた時は自社製品を6人で作るといった感じで、それぞれが自分の専門分野を持っています。ただ、全てのポジションで共通して必要な能力は最新の論文を追っていくというところです。関連分野の新しい論文が出たらチームの誰かが詳細を調べ、その後全員での論文の読み回15分位で行っていました。そして実装に移す価値があると判断した場合は論文からコードを書き起こしていきます。基本的にはこれらが機械学習エンジニアが行う仕事です。
実装したのちプロダクションに落とし込む際の所謂デプロイも全て私たちが行っていました。スタートアップで活躍を希望される方は、機械学習だけでなく、Webやモバイルの開発、インフラの知識などもある程度できた方が採用される確率は高くなると思います。

###では、AidemyのAIアプリ開発はどうだったのか
まず前提として、私が`そもそも機械学習エンジニアは何をするのか`で提示させていただいた`論文を読み実装する力`というのは、おそらくどのプログラミングスクールにおいても勉強できないと思っています。
これは、ある程度の力、基礎力が身についてから自らでガリガリと日々繰り返しながら練習していく必要があります。もちろん論文を読む英語力も力をつける必要がありますし、その後`CNNって何?`とならないようなコードにきちんと書き起こせる技術力とその技術に付随する理論をしっかりと理解する必要があります。

という前提のもと、AidemyのAIアプリ開発では何を学べるのかについてですが、スタートアップで働く機械学習エンジニアの仕事の流れである論文読みから実装、デプロイまでを2時間の映画とした場合、それをギュッと5分にまとめた感じです。
`そんな価値しかないということではなく、ただの比喩です。`
5分にまとまっていても、しっかりとスタート地点から終点であるデプロイまでコースに含まれているので、機械学習エンジニアの仕事の流れが掴めると思います。この何かのイメージを掴むというのは勉強する過程で重要なのは、かなりの量を独学してきた経験から断言できるものです。
この一通りの流れを理解することで、あとは少しづつ幅を広げていけば良いわけです。
他のプログラミングスクールでは、機械学習のモデルをトレーニングして終わり。なんていうのも結構あったので、しっかりとデプロイの仕方までコースに組み込まれている点は素晴らしいと思いました。

ギュッと詰め込まれているぶん物足りなさは感じましたが、それは他にまだまだあるコースでカバーできるのかなと思いました。コース単体で見るのではなく、Aidemy全体で見るとある程度の力はつくと思います。

###前半まとめ
この記事では機械学習エンジニアの仕事内容と、スタートアップで機械学習エンジニアとして働く場合の最低限必要な力である`論文を読んで実装、そしてデプロイする為の技術力とそれに付随する理論の知識`について説明し、この最低限の力はどのプログラミングスクールでも得られないことにも触れました。
ですが、その最低限の力を得る為のスタートラインに立つためにAidemyで機械学習を勉強することは決して間違いではありません。

##後半パート
###AIアプリ開発で作成したものについて
今回私が開発したのは、胸部のX-Ray画像を用いて新型コロナウィルスに感染しているかどうかを予測するものです。

Application URl: https://detect-covid19.herokuapp.com/
* メンテナンスは行っておりません。リンク切れの場合もあります。
`このアプリケーションは、X-ray画像から新型コロナウィルスに感染しているかどうかを判定するものです。 ただし、プログラミング学習目的のアプリケーションであり、正確に新型コロナウィルスに感染しているかを判定するためのツールではありません。`

### Datasetについて
新型コロナウィルスの陽性患者のサンプルは<a href="https://github.com/ieee8023/covid-chestxray-dataset">こちら</a>から。
健康体のX-ray画像は<a href="https://www.kaggle.com/paultimothymooney/chest-xray-pneumonia">こちら</a>から。
それぞれのデータセットから、ノイズがのってしまっている画像を取り除きました。
それぞれから、67枚の画像を選びそのうちPositiveとNegativeそれぞれから6枚ずつ計12枚をTest setとし、残りのデータを混ぜ合わせた中からランダムに選択された20%をValidation setとしました。

### Dataのサンプル
- Positive(陽性)
![Positive_samples.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1214152/56505bde-d0e2-e987-13cd-70731a952858.jpeg)

- Negative(陰性)
![Negative_samples.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1214152/0fa5233b-9a54-4400-7fab-570758f768d2.jpeg)

###事前処理
以下の事前処理を行いました。

- 224 by 224にリサイズ
- 10度以内(両方向)のランダム回転
- 0-1範囲にリスケール

###モデルの構造
学習済のVGG16の最終層を取り除き、複数の層を追加しました。詳しくわ以下の画像をご覧ください。
![model_archtecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1214152/030d9ee0-fb19-6465-a0cd-c584129c41a7.png)

###ハイパーパラメータ含む設定
- Batch size:
1
- Epochs:
20
- Optimizer:
Learning Rate 0.01でLR decayはLR / Epochsに設定しました。
- Loss:
Binary crossentropy

###モデルの評価
バッチサイズを1に設定ためどちらの値も小刻みに変化していますが、極端なオーバーフィッティングやアンダーフィッティングはみられませんでした。
![acc_loss_result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1214152/685feeb5-dd16-1df1-67f2-15fc93d35f9d.jpeg)

###後半まとめ
今回はVGG16をもとに転移学習を行い、X-ray画像に対して2つのクラスの分類を行いました。
そもそものデータ量が少量であるため、本当に正確に予測できているかは分かりません。
また、トレーニングにかかる時間やメモリも特に気にする必要はありませんでしたし、ランダムに設定したパラメータでそこそこの数字が取れたので、チューニングは行っていません。