機械学習体験の手引き～AWSとGoogle Colaboratoryの違い～

# **機械学習体験の手引き**～AWSとGoogle Colaboratoryの違い～
## はじめに
　巷で話題になっている人工知能や機械学習。実際に触ることがほとんどないのが実情ですよね。（かくいう筆者もその一人だった・・・）
しかし、この世の中では<font color= blue>機械学習を無料で、かつ誰でも気軽に手を出すことができる</font>便利な機能が存在する。
　その方法が今回紹介する**Amazon Web Service**（以降はAWSと呼ぶ）と**Google Colaboratory**の２つだ。



## いきさつ
　筆者は情報系の学科に属する大学生で、研究室で機械学習に関する研究を行っている。（とはいえまだまだ初歩の初歩・・・）
もともと機械学習？あーはいはいあれね最近流行りのやつねくらいの知識で、日常生活とはかけ離れたものだと考えていた。だが、この２つの機械学習体験を通して機械学習がどういったものなのか、日常生活にどのように生かされているのかを知る機会を得た。

　*機械学習について少し気になるけどなにから始めればいいのかわからない、実際の使い勝手はどうなんだろうと思っている方*にぜひ読んでいただきたい。

　実際に使ってみた感想とそれぞれの説明を以下に記す。

## AWS Educate
![Hcsyjr44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566577/4d7bf159-d85c-16e3-5081-65e32d3a3219.png)
**Amazon**というと　あれ？通販サービスか？と思う人もいるかもしれない。実はAmazonは機械学習関連については非常に発展している。
AWSを使って機械学習を行うなかで**Amazon Sagemaker**というシステムを用いた。

基本的にAWSは有料で、実際に使用した分だけの金額が必要になるのだがAWS Educateを利用すれば学生は無料で体験することができる。
AWS Educate は Amazon のグローバルイニシアティブとして、クラウド技術のスキルを身に付けるための総合的なリソースを学生に提供します。AWS Educate は実世界の応用学習経験に焦点を置いた学習コンテンツで、若い学習者が自分のペースでクラウドコンピューティング技術を学ぶことができます。これらのクラウドコンピューティングは、人工知能、音声認識、顔認識、ゲーム、医療の進歩などの分野でイノベーションの推進力となります。
14 才以上の方は無料で AWS Educate に参加し、クラウドの学習を始められます。また最高 75 USD の AWS プロモーションクレジットも受け取ることができます。
（AWS Educate公式サイトから引用）

### SageMakerの概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566577/016be1e0-4814-73fb-4889-606c28977e76.png)

SageMakerは「オーサリング」「トレーニング」「ホスティング」の3つのモジュールで構成されている。
####<オーサリング>
いわゆるデータセットの前処理の工程のこと。機械学習の9割はデータセットの前処理だ、と言われているほど重要な工程である。
AWS SageMakerでは、Jupyter NotebookをCPUベースやGPUベースなど、クラウド上で利用状況に合わせて簡単にセットアップ＆利用が可能となっている。

####<トレーニング>
SageMakerが提供しているBuilt-inのアルゴリズムやDeep Learningフレームワーク、Dockerによる独自学習環境を使ってモデルをトレーニングすることができる。
生成したモデルはS3に保存される。
このモデルはそのままSageMakerにホスティングを出来るほか、AWS以外に持ち出してIoTデバイスなどにデプロイすることもできる。

####<モデルホスティング>
構築したモデルをリアルタイムで使えるように、HTTPSエンドポイントが提供される。

### AWS Educateを利用するには・・・
機械学習を行うために必要な手順は以下の5つである。
1．アカウント登録
2．AWS マネジメントコンソールの画面を開く
3．Amazon S3 バケットを作成する
4．Amazon SageMaker ノートブックインスタンスの作成
5．Jupyterノートブックを作成する

####1．アカウント登録
以下のサイトからAWSのサイトに飛ぶことができる。
https://aws.amazon.com/jp/education/awseducate/
初めての方は赤枠をクリックしていただき、アカウントをお持ちの方は下のサイトからログインしていただく。ここでは登録の工程の詳細は省略する。
![AWS.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566577/f55fe30d-a100-4973-ca5a-a025c88fa88d.png)

####2．AWSマネジメントコンソールの画面を開く
ログイン後右上のAWS Accountをクリックしてコンソールに移動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566577/816d2695-dd97-3100-95d2-067765f4e028.png)
その後、サービス検索から自分の使いたいサービスを検索する。今回はS3とAmazon Sagemakerを利用する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566577/7c0681c1-09cd-a5e6-2f31-49735d20f293.png)

####3．AmazonS3バケットの作成
　S3バケットとはSimple Storage Serviceの略でインターネット用のストレージサービスのことである。要するにデータを保存したり、結果を残しておくフォルダのようなものだと考えていただければよいと思う。
　サービス検索からS3を開き、バケットを作成するを押して指示に従ってバケット作成を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566577/ef2b6ff4-a01d-1211-fad6-33d88f9b5fc5.png)リージョンはリージニア北部に設定し、バケット名は既に存在するものでなければなんでもよい。（ただしリージョンを変えてしまうとアクセス制限を食らったりする・・・）


####4．Amazon SageMaker ノートブックインスタンスの作成
サービス検索からAmazon Sagemakerを開き、以下の画面を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566577/2c1e5c74-2562-65cf-fbc1-86cdf3639a5a.png)右のノートブックインスタンスの作成をクリックすると次の図のような画面が表示される。Create notebook instanceをクリックして指示に従いながらノートブックインスタンスを作成する。ここでのインスタンスはデフォルトの<font color = red>ml.t2.medium</font>に設定している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566577/3917394f-9c46-1fb8-458b-e68626dcac35.png)

####5．Jupyterノートブックの作成
ノートブックインスタンスを作成してしばらくするとOpen Jupyterと表示されるのでクリックし、次のような画面を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566577/9c9875e3-10cf-4800-3993-a9a57a8345a5.png)

ここまでが準備段階となっている。

こちらのサイトを参考にしてk-meansクラスタリングを行った。
https://qiita.com/leomaro7/items/a524121f366764819a98

細かいプログラム等は省略するがk-meansクラスタリングについて軽く説明する。
#####k-meansとは
機械学習の手法の一つで、ラベル付けされていないデータに対応する教師無し学習である。クラスタの平均を用いて与えられたクラスタ数に分類する手法のこと
。。。よくわからない。。。
→今回であれば0~9の手書き数字の特徴を捉えてそれを10個に分類分けする！

すると・・・
データセットのダウンロード、調査、前処理が終わり、トレーニングに差し掛かろうとしたとき、事件はおきた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566577/82235e70-cdce-97cc-5889-bab12e1b8b67.png)

上図のプログラムを実行すると以下のエラーが表示された。
<font color = Red>ClientError</font>: An error occurred (AccessDeniedException) when calling the CreateTrainingJob operation: User: arn:aws:sts::136879011433:assumed-role/AmazonSageMaker-ExecutionRole-20191028T204023/SageMaker is not authorized to perform: sagemaker:CreateTrainingJob on resource: arn:aws:sagemaker:us-east-1:136879011433:training-job/kmeans-2019-10-28-21-15-39-958 with an explicit deny

作成したノートブックインスタンスのIAMロールがトレーニングを実行することに対して許可がないという風なエラーメッセージ・・・
有料じゃないと進めないのか・・・と思っていたがここから進むにあたってインスタンスを変更する必要があった。デフォルトでは<font color = red>ml.t2.medium</font>となっていたが、これを<font color = red>ml.m4.xlarge</font>に変えて実行することでこのエラーを乗り切ることができた。
よっしゃあこれでいけるぞおお
.
.
.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566577/d1ed9a69-a056-b218-9c46-0cc2336d3445.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566577/db4c3539-6798-dece-d5be-0d077d689dd4.png)
またエラーかいいいいいいい
簡単に説明するするとこのアカウントのリソースが限度に達したので、AWSサポートに問い合わせて上限解放して的なことが書いてあるみたい。
無料枠だとこれが限界みたいです泣

教授にClass roomの申請をお願いして続きを行うことにした。ここにClass roomの紹介を記したサイトを示す。これは教育者と学生がクレジットカードを使用せずにプロジェクトを実行できるように作られた機能で、申請には理由と所属がわかるリンクなどが必要であり、審査を通らなければならない（みたい）
https://aws.amazon.com/jp/blogs/publicsector/introducing-aws-educate-classrooms/
インスタンスを<font color = red>ml.t2.medium</font>に変更し、実行するとなんとか動かすことができた。
トレーニング・・・<font color=red>ml.m4.xlarge</font>
ホスティング・・・<font color = red>ml.t2.medium</font>
#####※ちなみに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566577/f19df58b-c372-8771-53ae-1a5437f584c8.png)
一つのインスタンスに対しては一つのエンドポイントが対応しており、同時に複数の実装を行おうとすると上記のようなエラーが表示される。なので一つ機械学習の内容が終わったらエンドポイントを削除しておくことをおすすめする。

すると以下のように結果が得られた。これは100個分の推論結果であり、100個の手書き数字の画像を分類分けしたものの一部である。違う数字が混じっているのもあるが大体分類分けできていることが確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566577/b316713e-2bd7-368f-a837-7706ac8c3074.png)

ここで**Google　Colaboratory**に移行する。
## Google Colaboratory
![Newgooglelogo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566577/5b2f6efa-ce6f-f93a-69a2-758b03e79086.png)
　こちらは特別な手続きが少ないうえに<font color = blown>**ブラウザとインターネットさえ**</font>あれば機械学習のプロジェクトが始めることができる。実際に使ってみた。
###メリット
#### 環境構築がほぼ不要
　Google Colaboratoryはジュピター・ノートブックをクラウド上で動かすが、PythonやNumpyなど、機械学習で必要なほぼ全ての環境がすでに構築されている。必要なのはブラウザのみで、すぐに機械学習を始めることが可能。
#### チーム内での共有が簡単
　Google Colabで書いたコード（ノートブック）は、グーグルドライブで保存される。なので、チーム内でノートブックの共有などが非常に簡単で、かつ権限管理などGoogle Drive上で行えるので安心。
#### GPUを含めて無料で利用が可能
　Google Colabがこれだけ話題になったのも、GPU（Tesla K80 GPU）が無料で使えるためである。機械学習では大規模なデータを、高負荷がかかる計算をすることが多々ある。GPU環境を使うことで、時間短縮が可能。・・・しかも無料で使える。
###デメリット
#### データの読み込みなどで特殊な処理を覚える必要がある
　今までローカルで使っていたデータセットなどを読み込む際に、一つ処理を加えてあげる必要がある。Google DriveのAPIを利用したり、PyDriveなどのラッパーを利用してデータを読み込む必要がある。難しい処理ではないので、一度覚えてしまえば特に問題にはならない。
#### Jupyter Notebookと使い勝手が多少異なる
　ショートカットキーの設定を変更したり、セルの追加や削除などの基本的な操作方法に慣れる必要がある。
#### 連続で12時間までしか使用できない
　ノートブックを開いて12時間までしか使用できないので開いたままにして保存を忘れているとせっかく実行した内容をもう一度初めからやり直さないといけなくなる。筆者も保存を忘れていて発表の際に実行しなおして時間がかかった覚えがある。セッションが切れてから90分以上経つと、インスタンスが落とされる仕様になってるため、そもそも重い処理を長時間かけて回す、学習させるといった用途には向いてない。

実際に筆者もGoogle Colaboratory試してみてあまりのお手軽さに驚いた。

###Google Colaboratoryを利用するには・・・
####1．Googleアカウントを作成
Googleアカウントを作成して以下のサイトにアクセスする
https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja
####2．左上のファイルからPython3の新しいノートブックを作成をクリック
<img width="906" alt="Goo.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566577/a070ff83-14fe-8f53-2238-42d7ad0f4f06.png">
.
.
.
**終了！　。。。。え？これだけ？**

その後以下のサイトを参考にして２つほど試して動かしてみた。こちらもプログラム等は割愛する。
➀手書き数字の認識
➁画像から顔を検出してモザイクをかける
https://ueqareer.net/2980

####➀手書き数字の認識
まず、MNISTとよばれるデータケースを使って、手書き数字の認識を行う。
MNISTとは手書き数字画像60000枚とテスト画像10000枚を集めた画像データセットのことで以下の図のようにそれぞれの数字の画像が含まれている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566577/7fd7adf1-404a-004d-6e95-bafee8398a44.png)

詳細な内容やプログラムは大体どの機種で試しても変わらないのでここでの説明は省くことにする。GoogleColaboratoryではGoogleDriveをマウントする必要がある。その後、GoogleDriveのなかにディレクトリを作成し、手書き画像用のフォルダを作成してそのフォルダに移動する。
<img width="490" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566577/e6c07c5c-c22a-8c05-26b0-e333b6588e68.png">

ここで簡単かつ重要なのが
**フォルダに画像をアップロードするだけで使える**
ということである。
　機械学習では基本トレーニングを行い、モデルを作成して未知のデータに対する動きをみて結果を確認するが、大体のExample（特にAWS）は元のデータケースから訓練用データとテスト用データにわけておき、最後のホスティングの段階でそのテスト用データを使って結果を確かめることが多い。しかし、新しく加えたデータに関するテストを行うには手がかかる。そういう意味ではGoogle Colaboratoryは非常に便利で、<font color=blown>画像をアップロードし、プログラム内で画像のURLを参照しているところを変えるだけ</font>で済むのである。これは非常に便利な機能である。画像を扱う内容の機械学習をやる者にとっては助かることが多い。

実際に動かしてみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566577/21147d35-09b5-5d3c-eca0-d041b7ed423c.png)

このように結果が得られる。上の画像をGoogleドライブにおき参照すると正しくそれが５であると認識している。

####➁画像から顔を検出してモザイクをかける
次に画像から顔を認識してモザイクをかける。
こちらも大体の工程は➀と大して変わらない。どうやって顔を認識するのか、どうやってモザイクをかけるのか簡単に解説する。
#####・顔検出について
そもそも画像のこの部分は人の顔/人の顔ではないという判定をする評価器が必要で、それには通常何千枚というテストデータを学習させて作らないといけないが、OpenCVには標準で多くの識別器がついており、正面顔検出の識別器も存在する。今回はそれを利用する。

#####・モザイクのかけ方
今回は非可逆変換のモザイク処理を行う。
OpenCVにはモザイク処理のライブラリがないので自分で作らないといけない。下図のように一定領域の色情報を読み込んでその平均値を算出し求められた結果をもとに画像を処理する方法を使う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566577/ef35e9fb-03a3-1b31-f37c-ec233e6416fd.png)

実行すると以下のような結果が得られた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566577/b9f0aad1-2dfb-ef54-6063-b7919be40bb0.png)

正面を向いていなかったりかなり個性的な顔をしている者は顔と認識されず、モザイクがかからなかった。

##まとめ
これら２つの簡単な機械学習を通して自分なりに評価をしてみた。Exampleというのは俗にいう実行例のことである。AWSでは次のようなサイトから得ることができる。https://github.com/awslabs/amazon-sagemaker-examples
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566577/706097cf-b943-cc23-37ef-f9570d55c3e4.png)

　気軽に機械学習を触りたい！という方ならGoogle Colaboratoryをおすすめする。AWS Educateでは無料でできるとは書いてあるものの実行していくなかで制限があり、申請にも時間がかかってしまう。また、新しいデータを使ってテストする際もGoogle Colaboratoryの方がより手軽に実行できるのも良い点だといえる。
　しかし、これから長く機械学習を行っていくならExampleの数も多く、世間一般的にも流通しているAWSの方がよいと感じた。実際にQiitaの記事数をみても圧倒的にAWSに関する記事の方が多く、まだまだGoogleColaboratoryが流通していないことがわかる。

初めてのQiitaへの投稿なので分かりにくい表現や正しいかどうか危ういところもあったと思うがご了承いただきたい。また、細かいプログラムなどは文量的に書けず、途中URLを貼らせていただいた。
ここまで読んでいただきありがとうございました。