Google Colaboratoryを使ったRNNの動作確認（2022年3月30日）

# 1. はじめに
　YOLO・CNNといったニューラルネットワークを使った機械学習を勉強中の者です。この手のコモディティ化以前のテクノロジーの学習で障害となるのは、プラットフォームやソフトウェアライブラリ等がどんどんアップデートされているので、ほんのちょっと前に書かれた記事であっても、書かれた通りに動かすことができないという点です（筆者も度々遭遇して難儀しています）。
　つい昨晩、RNNに挑戦したところ、やはり参考にさせて頂いたサイト記事の通りには実行できず、いろいろとネット上を調べまわった結果、何とか動かすことができましたので、自分用の備忘録を兼ねて記録しておきたいと思います。
# 2. 参考にさせて頂いたサイト記事
RNN（回帰的ニューラルネットワーク）とは？Pythonでの実装方法と一緒に見ていこう！
https://toukei-lab.com/rnn
更新日 2021年9月14日
# 3. Google Colabratoryの準備
　参考にさせて頂いたサイト記事ではPythonの動作環境を特定していませんでしたが、本記事を参考にして0からやってみようという方のために、最も手軽に試せるGoogle Colaboratoryの操作手順を含めて説明していきたいと思います。
## 3-1 Google Colabratoryとは？
　Googleがブラウザ上で動作するPythonの実行環境として提供しているものです。計算能力をフルに使える有料プランもありますが、物凄く大規模なデータでの使用でなければフリープランで十分です。大学の研究なども概ねフリープランでOKでしょう。何といっても優れている点は、Python実行環境のインストールが不要といういう点です。また、標準で用意されているライブラリが常に最新の状態にキープされている点も重要です。また、フリーでもGPUが使用可能なこともありがたいです。ニューラルネットワークの学習には多くの計算量が必要で、貧弱な環境ではちょっとした学習でも1晩とか必要になったりしますが、GPUを使うだけで10倍くらい速く動かせます（ただしフリープランでは連続使用時間等に制限あり）。計算はすべてGoogle側の計算リソースを使いますから、手元も計算機の能力依存しない点も重要です（どんなpoorなパソコンからアクセスしても利用できる計算能力は同じということです）。ちなみに、colaboratoryという単語が聞きなれないなぁ、と筆者も思ったのですが、綴りをよく見たところlaboratory（研究室、研究所）にcoを付けた造語のようです。coには共同で作業するなどの意味がありますので、共同研究室といった意味合いなのでしょう。
## 3-2 Google Colaboratoryへのアクセス
　比較してませんが、Googleの提供するサービスですから、ブラウザとしてはGoogle Chromeを使うのがベストだと思います。なので以下はGoogle Chromeの使用を前提としています。まずはGoogle Chromeで次のサイトにアクセスしましょう。
https://colab.research.google.com/?hl=ja
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565347/b1c095c9-20a4-7c0c-4425-cda03b520fa9.png)
　まずはログインをして下さい。もちろんGoogleアカウントが必要ですので、持っていない方は次のサイト記事などを参考にして作成して下さい。
Google アカウントの作成
https://support.google.com/accounts/answer/27441?hl=ja&msclkid=87679f13afa211ecbd0751ca8ded7ff0
## 3-3 ワーク領域の作成
　ログイン後は次のような画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565347/419215c5-6a82-3161-76fd-ab59c9b990e7.png)
　ここで、右下の「ノートブックを新規作成」を押します。”ノートブック”というのは、MicrosoftやAdobeのアプリではプロジェクトに相当するものだと思えばよいと思います。なお、プログラム毎に異なるワーク領域（名前は後で変更できます）を用意することで、使い分けもできます。新規作成すると、次のような画面が現れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565347/01d18dc4-0486-5903-4bce-6cc194935ca6.png)
　これでもうPythonが実行できます。
# 4. RNNプログラムの実行
## 4-0 Hello World!
　言語の種類を問わず、プログラミングの学習で最初にやるべきことは、Hello Worldですね。僕もこれをやると落ち着くのでついやります。黒丸に白矢印のアイコンの右にある空白領域（デフォルトでここが選択状態になっています）に、
print("Hello World!")
と打ちましょう。実行は、黒丸に白矢印のアイコンをマウスで左クリックします。最初は初期化処理が走るので、5秒くらい待たされますが、次のように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565347/f2f34269-f214-57ec-561b-388d3201cd92.png)
## 4-1 RNN用テストデータの入手とアップロード
　プログラムを作る前に、RNNの動作確認用のデータを入手しておきます。
Kaggle-“Air Passenger”
https://www.kaggle.com/datasets/rakannimer/air-passengers
　某航空会社の1959～1961年までの月毎の乗客数のデータだそうです。ダウンロードの際にログインを求められますので、Googleアカウントをそのまま使うのが簡単です。ダウンロードに成功すると、次のファイルが入手できます。
AirPassengers.csv
　今度は、これをGoogle Colaboratoryにアップロードします。まずは画面の左端に並んでいるフォルダアイコン（マウスカーソルを載せると”ファイル”と表示されますがｗ）を左クリックして下さい。次のような画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565347/9671b212-58e9-e96c-e155-242c633da170.png)
　次に、アップロードのアイコン（文書に上向き矢印）を押し、入手したCSVファイルを指定します。アップロードに成功すると次のようになります（リサイクル時に削除されます、という警告が出ますが無視でOKです）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565347/17728655-c40e-0782-69f5-eade06dabfb7.png)
## 4-2 RNNのPythonコード
　新しいコード記述領域を確保します。上部真ん中辺りにある”+ コード”と書かれたアイコンをクリックすると次のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565347/52093ce2-6741-4fb9-7247-c14ded4e2180.png)
### 4-2-1 インポート
　まずは必要なライブラリをインポートします。
　ここではやはりGoogleが提供しているTensorflowというニューラルネットワーク計算用ライブラリを使用しますが、デフォルトで入っていないtflearnというものを導入しておきます。
```
pip install git+https://github.com/tflearn/tflearn.git
```
　導入に成功すると次のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565347/25e94d25-dfba-18e1-4212-5d35d9d54c31.png)
　また新しいコード領域を確保し、次のインポートを実行します。
```
import tensorflow
import tflearn
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565347/67c6fc28-7880-58a0-6586-f2f0d97faee1.png)
### 4-2-2 テスト用データの読み込みと初期化
　アップロードしたCSVデータの読み込みと、それを教師データ・推論データにわけるコードを記述して実行します。
```
tensorflow.compat.v1.reset_default_graph()

df = pd.read_csv('AirPassengers.csv',usecols=[1])
dataset = df.values
dataset = df.astype('float32')
dataset = (dataset - np.min(dataset))/(np.max(dataset)-np.min(dataset))

dataset = np.array(dataset)

def create_dataset(dataset, steps_of_history, steps_in_future):
    X, Y = [], []
    for i in range(0, len(dataset)-steps_of_history, steps_in_future):
        X.append(dataset[i:i+steps_of_history])
        Y.append(dataset[i + steps_of_history])
    X = np.reshape(np.array(X), [-1, steps_of_history, 1])
    Y = np.reshape(np.array(Y), [-1, 1])
    return X, Y

def split_data(x, y, test_size=0.1):
    pos = round(len(x) * (1 - test_size))
    trainX, trainY = x[:pos], y[:pos]
    testX, testY   = x[pos:], y[pos:]
    return trainX, trainY, testX, testY

steps_of_history = 1
steps_in_future = 1
X, Y = create_dataset(dataset, steps_of_history, steps_in_future)
trainX, trainY, testX, testY = split_data(X, Y, test_size = 0.33)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565347/c22606fd-c6f8-b0ed-992f-080e185d6169.png)
### 4-2-3 ニューラルネットワークの定義
　次のコードを入力して実行し、ニューラルネットワークを定義します。
```
net = tflearn.input_data(shape=[None, steps_of_history, 1])
net = tflearn.lstm(net, n_units=6)
net = tflearn.fully_connected(net, 1, activation='linear')
net = tflearn.regression(net, optimizer='adam', learning_rate=0.001,
        loss='mean_square')
model = tflearn.DNN(net, tensorboard_verbose=0)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565347/415c4e09-5508-83fe-b9ad-b702c1a8ee4f.png)
　警告が出ますが無視で。
### 4-2-4 トレーニングの実行
　新しいコード領域を確保して次のコードを入力・実行します。
```
model.fit(trainX, trainY, validation_set=0.1, batch_size=1, n_epoch=50)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565347/402019c9-497d-bf8a-de1e-a62e95f1adfd.png)
### 4-2-5 推論の実行
　新しいコード領域を確保して次のコードを入力・実行します。
```
test_predict = model.predict(testX)
rmse = np.sqrt(np.mean((test_predict-testY)**2))
print(rmse)
```
　推論の精度がRMSE（二乗平均平方根誤差）が出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565347/c5f80032-870e-32a2-4cd6-e94ca0c0fd00.png)
# 5. おわりに
　以上、2022年3月30日現在、記事内容の通りに実行可能です。参考にさせて頂いたサイト記事からの変更点は以下です。
①インポート前のtflearnの導入
②reset_default_graph()をtensorflowのバージョン1で実行





、