Python Colaboratory Ⅴ

CNN (Convolutional Neural Network)の実現

ここまで、CNN の概要について説明してきました。
引き続き Keras で CNN を実現する方法について考えていきます。
Keras で CNN を実装するには、次の手順が必要になります。
① CSV 時系列デ-タの読込
② 時系列デ-タの標準化
③ 3種の timeseries_dataset デ-タの作成
  訓練デ-タセット train_dataset
  検証デ-タセット val_dataset
  テストデ-タセット test_dataset
④ Keras CNN モデルの構築
⑤ コ-ルバック作成
⑥ compile メソッド
⑦ fit メソッド
⑧ 損失曲線表示
⑨ 5つ先の予測値

①~⑨ の具体的内容は
RNN の理解-Ⅱ
  ~
予測値表示の結果確認
を読んでいただくと理解できるのですが、かなり長文です。
もう少し簡略化した説明が
LSTM(Long Short Term Memory)の実現
  ~
compile メソッド
にあります。 ただ、みなさんお忙しいでしょうから ④を除く①~⑨をまとめたファイル
keras-lstm-test.ipynb
はコピ-して使用しますので LSTM モデルファイルまとめ
を見て、まずは keras-lstm-test.ipynb のファイル内容を確認してください。
④についてはこれから順次説明していきます。
①~③,⑤~⑨はほぼコピ-して使用します。

CNN モデルの構築

CNN モデルを構築していきます。

  1. モジュ-ル

    必要なモジュ-ルは2つです。
    from tensorflow import keras
    from keras import layers

  2. Input 宣言

    inputs = keras.Input(shape=(sequence_length, 1))
    input デ-タの配列がどんな型式になっているか宣言します。
    今回は、sequence_length=20 個の配列が入力されると宣言しています。
    この inputs オブジェクトには、このモデルが処理するデ-タの形状とデ-タ型に関する情報が 含まれています。
    このようなオブジェクトをシンボリックテンソルと呼びます。
    シンボリックテンソルとは、実際のデ-タは含んでいないテンソルのことであり、 モデルを使うときにモデルに渡される実際のテンソルの仕様を定義しています。
    sequence_length = 20
    inputs = keras.Input(shape=(sequence_length, 1))
    inputs は 101個のデ-タを 20個(sequence_length)組にした時系列デ-タであり、 これに対して各1個の目的値があるので、 上記のように Input デ-タの shape を指定する必要があります。

Conv1D 層の作成

畳込み Conv1D 層を規定します。
今回、各引数を設定します。

  1. フィルタ数 ⇒ 7

    今回、フィルタ数を7 にしました。
    なぜ、フィルタ数を 7 にするのか難しい質問ですね。
    時系列デ-タの特徴を以下の7つに分類したいと考えました。
     3. 非常に上向き
     2. かなり上向き
     1. やや上向き
     0. 横ばい
    -1. やや下向き
    -2. かなり下向き
    -3. 非常に下向き
    もっと細かく分類することも可能ですが、計算量が増えますのでこのぐらいが妥当と思います。

  2. カ-ネルサイズ ⇒ 17

    カ-ネルサイズは 17 としました。
    一般的にカ-ネル数は奇数にするのがよいようです。

  3. 活性化関数

    時系列デ-タは -1~+1 になるように標準偏差値に変換していますので活性化関数は tanh としました。
    activation = "tanh"

  4. Conv1D 層まとめ

    Conv1D 層をまとめると
    x = layers.Conv1D(7, 17, activation="tanh")(inputs)
    となります。

Pooling1D 層の作成

  • MaxPooling1D

    最大値プ-リング層を作成します。
    pool_size は 2 とします。
    x = layers.MaxPooling1D(2)(x)

  • GlobalAveragePooling1D

    時系列データのためのグローバルな平均プーリング演算を行ないます。
    次元ごとに平均をとったものが出力となります。
    x = layers.GlobalAveragePooling1D()(x)

  • Dense Last の規定

    Dense 層 Last は Outputs(出力層)です。
    CNN の場合、この層には活性化関数を設定せず、単に units(出力次元数)を1とするだけが一般的なようです。
    outputs = layers.Dense(1)(x)

  • モデル確定

    モデルを確定します。
    model = keras.Model(inputs, outputs)
    モデルがどのようにできたか見ることができます。
    print(model.summary())


  • CNN モデルまとめ

    ここまでをまとめます。

    # lstm-test-1.ipynb
    from tensorflow import keras
    from keras import layers
    
    sequence_length = 20
    inputs = keras.Input(shape=(sequence_length, 1))
    x = layers.Conv1D(7, 17, activation="tanh")(inputs)
    x = layers.MaxPooling1D(2)(x)
    x = layers.GlobalAveragePooling1D()(x)
    outputs = layers.Dense(1)(x)
    model = keras.Model(inputs, outputs)
    print("モデルア-キテクチャ")
    print(model.summary())
    

    CNN モデル保存用ファイル名変更

    ModelCheckpoint コ-ルバックで設定している 最も性能の良いモデルを保存する保存用ファイル名を
    jena_lstm.keras ⇒ jena_cnn.keras
    に変更します。
    このファイルは predict メソッドを使用するときに呼び出すので
    model = keras.models.load_model(
      "drive/MyDrive/Colab Notebooks/my_data/jena_lstm.keras")
    ⇩   ⇩   ⇩   ⇩
    model = keras.models.load_model(
      "drive/MyDrive/Colab Notebooks/my_data/jena_cnn.keras")
    とする必要があります。

    ここまでで、keras-lstm-test.ipynb からの変更点がまとまりました。
    このあと、これらの変更点を適用した CNN 予測ファイル keras-cnn-test.ipynb を作成します。


  • CNN モデルファイルまとめ に進む
  • CNN(Convolutional Neural Network)概要 に戻る
  • 70VPS に戻る