Kerasでとりあえず動かしてみるディープラーニング#4

#はじめに
GPUが載ってないPCでディープラーニングをやってみたい、という人向けです。
通常ならGPUが必須な画像の判定等もGoogle Colabolatoryを使えば可能なようなので、試してみます。

#事前準備
Googleのアカウントが必要です。もし無い場合は作成が必要です。
Colaboratoryだと一時的にしかデータの保存ができないので、Googleドライブも併せて使用します。

#ログイン～新規ノートブック作成まで
「ファイル」→「Python3の新しいノートブック」で新規のjupyterノートブックを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93459/a245651b-a0fe-9f54-b61e-1500e23dd21c.png)

以下のように新規のノートブックが作成されます。
左上のファイル名をクリックすると、ファイル名を変更できます。ノートブックはGoogleドライブに自動で保存されるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93459/3b8a7a82-3b85-ac58-ff46-af3714aacada.png)

#サインカーブのサンプルを動かしてみる。
「Kerasでとりあえず動かしてみるディープラーニング#1」で作成したプログラムを貼り付けて動かしてみます。
https://qiita.com/norikawamura/items/f748b9bbf597a5953235

ローカルで動かした時と同様の結果が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93459/68483c93-c10b-b021-9969-e6f5cf6f70ff.png)


#CSVデータをアップロードしてみる
画面左上の「＞」のボタンをクリックし、さらに「ファイル」のタブを選択すると、以下のような画面が表示されます。
先ほどのサインカーブのサンプル実行で作成された「keras_reg_sin.h5」が表示されています。右クリックで表示されるメニューでダウンロードができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93459/2b668dac-f524-a6d5-edc3-256ce6c663ec.png)

左上の「アップロード」をクリックすると、ファイル選択ダイアログが表示され、ファイルをアップロードできます。
「Kerasでとりあえず動かしてみるディープラーニング#2」で使用した「abalone.data」をアップロードしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93459/24ac9fae-31cb-c01b-a142-8c3f9812ac65.png)
上図のように追加されます。「/content/abalone.data」というパスでアクセスできます。
「~#2」で作成したプログラムのファイル名指定部分を「filename = '/content/abalone.data'」と変更して実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93459/d74c12ce-9b80-62c0-d9de-033626ee41ad.png)
上図のように、これもローカルと同様に実行できます。

#Googleドライブを使用する
「アップロード」ボタンからでは、あまり大きなサイズのファイルをアップロードできないようです。
その場合は一旦Googleドライブにアップロードして、そのファイルを使用すればよいようです。

以下のコマンドを実行すると、リンクとテキストボックスが表示されます。
リンクをクリックして表示された文字列をテキストボックスにコピーしてエンター入力でGoogleドライブがマウントされます。

```Python
from google.colab import drive
drive.mount('/content/gdrive')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93459/9988f516-77af-c63f-2699-d38c467a9034.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93459/05104af0-2d89-81d5-3c10-fa6b32cde3a2.png)

#GPUを使ってみる
「ランタイム」メニューから「ランタイムのタイプを変更」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93459/4ad63a8a-1bd1-36a0-16ac-32b891ac8113.png)

ハードウェアアクセラレータに「GPU」を選択することで、GPUが使用できるようです。
※保存されたファイルやGoogleドライブのマウント等含めて環境がリセットされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93459/a9d6d511-fbe6-8de0-a565-347664bf42bd.png)

GPUを選択した場合も特にプログラム変更無しに実行できるようです。
（TPUを使う場合はプログラムの改変が必要なようです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93459/cb639b54-c44e-cd47-5112-12c145cd42d8.png)

#ZIPファイルを展開する
「現場で使える！TensorFlow開発入門 Kerasによる深層学習モデル構築手法」の第２部のサンプルを何とか動かそうと、Colaboratoryで試してみました。

事前にサンプルの画像データをZIPファイルにしてGoogleドライブにアップロードしておきます。
Colaboratoryでは「!~」でLinuxのコマンドを実行できるので以下のようにColaboratoryにファイルをコピーします。
（「My Drive」はスペースが入ってるので「My\ Drive」とエスケープしています）

```
!cp /content/gdrive/My\ Drive/colorize.zip /content
```

以下のようにファイルがコピーされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93459/ac251a86-51c4-a221-1d1e-1e96b2142d7f.png)

unzipコマンドでZIPファイルを展開します。

```
!unzip -q /content/colorize.zip
```

以下のようにフォルダが作成されて展開されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93459/61ca80e0-d270-d4c1-77c8-f1cb16a86d57.png)

#サンプルを動かしてみる
「TensorFlow開発入門」の「第９章」の「自動着色」を試してみます。
この書籍のサンプルもjupyter-notebookの形式なので、基本的にはノートブックをアップロードして、
「データの読み込み」のパスだけ「'/content/colorize'」に変更するだけで動かせます。
ただし、実際のところGPUでも結構時間がかかるので（多分７時間弱）、途中で止まってしまうと学習にかけた時間が無駄になるので、１０エポック毎に学習済みモデルを保存するように改変してみます。
「~.fitgenerator()」のパラメータにinitial_epochの指定を追加することで、
学習済みモデルに対して、学習を再開することができます。

以下のような感じで、最初の実行時には「for i in range(0,21):」にして実行し、
途中で止まったあとの再実行時に「savefile=~」のファイル名指定とループのrangeの開始を変更して実行します。

```Python
gdriveroot = '/content/gdrive/My Drive/'

savefile=gdriveroot +  "chap9_190418_epoch140.h5"
for i in range(14,21):
  if i != 0:
    autoencoder = keras.models.load_model(savefile)  
  epoch_step = 10
  initial_epoch = i * epoch_step 
  epochs= initial_epoch + epoch_step
   
  autoencoder.fit_generator(
      generator=train_gen,
      steps_per_epoch=train_steps,
      initial_epoch=initial_epoch,
      epochs=epochs,
      validation_data=val_gen,
      validation_steps=val_steps,
      # callbacks=callbacks, # コールバックを使用する場合はコメントアウトを外す
  )
  savefile=gdriveroot + "chap9_190418_epoch" + str(epochs) + ".h5"
  autoencoder.save(savefile)
```

#次回
　数字画像の判定をやってみます。
　https://qiita.com/norikawamura/items/a5c3844e7555202c35a4