「ゼロから作るDeep Learning」自習メモ（その１３）　Google Colaboratoryを使ってみる

「ゼロから作るDeep Learning」(斎藤 康毅　著　オライリー・ジャパン刊)を読んでいる時に、参照したサイト等をメモしていきます。　[その１２](https://qiita.com/slow_learner/items/ed10b1964c33e76235f3) ← → [その１４](https://qiita.com/slow_learner/items/c422bd3d06c86bf0beec)

自分のパソコンでJupyterLabを動かして学習してきましたが、メモリーエラーが多発するようになり、先に進めなくなりました。

で

GoogleのColaboratoryを試してみようかと思います。

##Colaboratory

Colaboratory という英単語はないようです。と言う事は、Googleが自社のサービスにつけた名前というわけで、
コラボ collaborate + 実験室 laboratory
からの造語なんでしょうか。
co + laboratory とすると、読み方は　コラボラトリー　でいいのかな？
コラボの意味を強調して
collabora(te) + (labora)tory と考えればコラボレイトリーという読み方もありうるけど、 l がひとつ多くなるし。


##Qiita にもたくさん投稿されている

[Qiitaでのcolaboratoryに関する情報](https://qiita.com/tags/colaboratory)

ということで、ぼちぼち行ってみます。



##やっぱり、ドライブのフォルダやファイルの構成が気になる
これまで、いろいろやってみて思うのは、プログラムを実行する時には、たくさんのライブラリや入力ファイルやpklファイルを参照するということ。
なので、それらをgoogle drive 上に作成、参照するために、フォルダとファイルの構成や、それらの指定の仕方を最初に押さえておかないといけません。

###パスを通す
とりあえず、ドライブをマウントしてから、ライブラリやファイルがあるフォルダへのパスを通しておけば問題なさそうです。

```python
# ドライブのマウント
from google.colab import drive
drive.mount('/content/drive')
```
/content/drive　の drive の部分は、自分で名前をつけていいようです。
この命令は、スクリプト内でGoogleDriveを使うときの名前をつけている、ということなんでしょうか。
で、このドライブ下には、自分用の領域としてフォルダ My Drive があり、その下にスクリプト実行用のフォルダやNotebook（～.ipynb）等を作れるということになります。

ということは、Colaboratoryで使用できるリソースは、すべて /content/ドライブ名/My Drive の下にあることになります。ところが、カレントディレクトリは/contentになっているので、相対パスでファイルを指定するときは注意が必要です。'ドライブ名/My Drive/ファイル名'としなければいけません。もちろんos.chdir()命令でカレントドライブを変更することもできます。カレントドライブの変更はそのNotebook内だけで有効で、他のNotebookには影響しないようです。

私は、他のファイルと分けるためにフォルダColab Notebooksを作り、さらにその下にこの本のプログラム例を置くフォルダとして deep_learning を作りました。また、この本のプログラムでしょっちゅう使うcommonとdatasetフォルダを作り、そこにはダウンロードしたプログラムやデータを配置しました。

そして、このフォルダ下のプログラムをどこからでも参照できるように、パスを通します。

```python
#パスの追加
import sys
sys.path.append('/content/drive/My Drive/Colab Notebooks/deep_learning/common')
sys.path.append('/content/drive/My Drive/Colab Notebooks/deep_learning/dataset')
```
これらを参照するプログラムは、以下のように修正します。

```python
#これまでJupyterLabでフォルダdatasetにあるモジュールを指定するときはこうしてた
from dataset.mnist import load_mnist

#パスを通しておけばこれでいい
from mnist import load_mnist
```
commonライブラリを参照をするプログラムはたくさんあるので、この修正をするのはけっこう大変そうです。


###いろいろ関連する関数を試してみた

```python
import os
print(os.getcwd())  #カレントディレクトリ
print(os.pardir) #親ディレクトリ
print(os.path.dirname(os.path.abspath(__file__))) #このスクリプトファイルがあるディレクトリを返すはずだが、対話モードではエラーになる
```
>/content
..
\---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-48-55f3798def23> in <module>()
      2 print(os.getcwd())  #カレントディレクトリ
      3 print(os.pardir)
----> 4 print(os.path.dirname(os.path.abspath(\__file\__))) 
      5 
NameError: name '\__file\__' is not defined

Google Colaboratoryの対話モードは、カレントディレクトリ/contentで動いているようです。
別のフォルダで上のスクリプトを実行しても同じ結果、カレントディレクトリは /content となります。
また、対話モードでは \__file\__ が使えないようです。カレントディレクトリが常に /content なんだから、使う意味もないんでしょうが。

しかし、ファイル名をつけて保存したスクリプト内では、\__file\__は使えるようです。
次のスクリプトは、きちんと動いてスクリプトと同じフォルダにあるファイルを読み込んでいます。

```python
# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 親ディレクトリのファイルをインポートするための設定
import numpy as np
from mnist import load_mnist
import matplotlib.pyplot as plt

def showImg(x):
    example = x.reshape((28, 28))
    plt.figure()
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(example, cmap=plt.cm.binary)
    plt.show()
    return

(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)

img = x_train[1]
label = t_train[1]
print(img.shape)  # (784,)
img = img.reshape(28, 28)  # 形状を元の画像サイズに変形
print(img.shape)  # (28, 28)
print(label)  # 0
showImg(img)
```
>(784,)
(28, 28)
0

importされたmnist.pyの中では、このようにファイルを指定しています

```mnist.pyでmnistデータのディレクトリをセットしているスクリプト
dataset_dir = os.path.dirname(os.path.abspath(__file__))
save_file = dataset_dir + "/mnist.pkl"
``` 
mnist.py があるフォルダ'/content/drive/My Drive/Colab Notebooks/deep_learning/dataset' から mnist.pkl を読み込めます。
 

###対話モードでファイルを指定する場合は、絶対パスを指定したほうが無難そう

```python
# coding: utf-8
import matplotlib.pyplot as plt
from matplotlib.image import imread

img = imread('/content/drive/My Drive/Colab Notebooks/deep_learning/dataset/lena.png') # 画像の読み込み
plt.imshow(img)

plt.show()
```

なんとか動きそうなので、本の中のプログラムを実際に動かして確認してから、
重くて動かせなかった犬猫写真の判別をやってみようかと思います。



[その１２](https://qiita.com/slow_learner/items/ed10b1964c33e76235f3) ← → [その１４](https://qiita.com/slow_learner/items/c422bd3d06c86bf0beec)
メモの目次等はこちらから　[読めない用語集](https://qiita.com/slow_learner/items/03eb3367119e98b5a22c)

##参考にしたサイト 
[Google ColaboratoryでGoogle Drive上の.pyファイルをインポート](https://qiita.com/Kunikata/items/45e731753e97bda28aab)
[__file__を使用しても実行中のスクリプトのディレクトリ名を取得できない理由を調べる](https://qiita.com/watyanabe164/items/384a738611fded1425fe)
[Colaboratory へようこそ](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja#scrollTo=P-H6Lw1vyNNd)
[深層学習実践Tips on Colaboratory](https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935)