スポンサードリンク



こんにちは。sinyです。

この記事ではディープラーニングのライブラリの1つであるKerasの基本的な使い方について記載しています。

今のところはディープラーニング設計でKerasを利用しているのですが、たびたび利用方法を忘れていしまうことが多々あるため、備忘録としてKerasでよく扱う機能について使い方をまとめます。

 この記事については、Kerasの使い方を随時更新していきます。
2019/4/14更新

Kerasの基本構成

ワークフレームの方式

ディープラーニング開発のフレームワークにはいろいろな種類がありますが、Kerasは「Define-and-run」と呼ばれる方式のフレームワークです。

これは、ニューラルネットワークモデル構成を定義してからデータを投入するという方式です。

 ディープラーニング開発のワークフレームには「Define-by-Run方式」というものもあります。
これは、データを投げながらニューラルネットワークモデルを定義するという方式でChainerとPytorchなどがこの方式を採用しています。

モデルの定義方法

Kerasにはニューラルネットワークモデルを定義する2つの方法があります。

1つは「Sequentialクラス」を利用する方法、もう1つは「Functional API」を利用する方法です。

Sequentialクラスは入力と出力が必ず1つずつのネットワーク構成しか定義することができません。
また、中間の層内でネットワークを分岐させるような構成も作れません。(層の線形スタック構成)

一方、Functional APIは完全カスタムなネットワーク構成を定義することができます。
入力が2つ、出力が1つといったネットワークを定義することができます。

 

 

Kerasの基本機能

Sequentialモデル

モデル定義

Sequentialモデル定義の基本的な例

上記は以下のニューラルネットワークモデルを定義したことになります。

要素 説明
Dense(keras.layers.Dense) Denseとは全結合ニューラルネットワークで、1つのニューラルネットワークを定義する。
model = keras.models.Sequential() シーケンシャル(順番に)モデルを追加するモデルを定義する。
model.add(Dense(10, activation='relu', input_shape=(4,))) mode.addでモデルに定義を順番に追加していく。
input_shape=入力するデータの次元数は最初の層だけに指定する。
model.add(Dense(3, activation='softmax')) Dense()の引数には、Dense(ユニット数, activation='活性化関数')を指定する。

 

  • モデルの最初のレイヤには入力のshapeについて情報を指定する必要がある。

     ※input_shape引数:shapeを示すタプルを指定(整数 ro None)
     ※Noneを指定すると任意の整数
     ※Dense のような2次元の層では input_dim引数を指定することで入力のshapeを指定できる。
     ※3次元のレイヤーでは input_dim引数と input_length引数を指定することで入力のshapeを指定
     ※batch_size=32と input_shape=(6, 8)を同時に指定した場合,想定されるバッチごとの入力のshapeは (32, 6, 8)となる。

  • Input_shapeの指定の仕方 
    ① model.add(Dense(32, input_shape=(784,)))
    ② model.add(Dense(32, input_dim=784))
    上記①,②は同じこと。

モデル構造のコンパイル

基本的にモデルのcompileには3つの引数を指定する。

サンプルコード

  • lossで損失関数を指定
  • optimizerに最適化アルゴリズムを指定
  • 評価関数のリスト

損失関数

損失関数の選択の目安(一般的に役立つ可能性がある組み合わせ)

問題の種類 損失関数
二値分類 binary_crossentropy
多クラス単一ラベル分類 categorical_crossentropy
多クラス多ラベル分類 binary_crossentropy
回帰問題(任意の値) mse
回帰問題(0~1の値) mse / binary_crossentropy

 

 

学習の実行

学習はfitメソッドで実行する。

 

  • model.fit(入力データ,正解ラベル, バッチサイズ、エポック数)
  • バッチサイズを小さくすると消費メモリが少なくて済むが、うまく動かなくなる。
  • エポックは学習の繰り返す数
  • fitメソッドの戻り値

    History オブジェクト. History.history 属性は 実行に成功したエポックにおける訓練の損失値と評価関数値の記録と,(適用可能ならば)検証における損失値と評価関数値も記録される。

  • loss
    →学習データでの損失値
  • va_loss
    →検証データでの損失値
  • acc
    →学習データでの正解率
  • val_acc
    →検証データでの正解率
  • lossとval_lossは以下のように抽出できる。

    <model>.history['loss'] <model>.history['val_loss']

モデルの評価

モデルの評価はevaluateメソッドを使う。

サンプルコード

 

  • evaluate(入力データ, 出力データ, batch_size,verbose=1or0,sample_weight, steps)
    ※バッチサイズはデフォルト32
    ※verboseは進行状況メッセージ出力モードで,0か1.
    ※sample_weight: サンプルの重み
    ※steps: 整数またはNone.評価ラウンド終了を宣言するまでの総ステップ数(サンプルのバッチ)
  • model.evaluateメソッドの戻り値
    test_loss, test_acc = model.evaluate(test_images, test_labels)
    ※test_loss:損失%
    ※test_acc:精度%

モデルの保存とロード

学習したモデルはファイルへ保存、ファイルからロードができる。

 

画像データ(CNN)の扱い

画像データを扱う場合は通常2次元のConv2D層を利用します。

  • model.add(Conv2D(フィルタ数,フィルタサイズ,入力データ)
    ※filters=32,kernel_size=3, input_shape=(256,256,3)という感じに書く。
    ※model.add(Conv2D(Output_depth,(window_height,window_width))
    ※例)model.add(Conv2D(32,(3,3), activation="relu",input_shape=(28,28,1))))
     28x28のグレースケール画像を3*3フィルタで畳み込んで
     (height,width,outputh=32)の3次元の出力特徴マップを生成
    ※padding: "valid"か"same"のどちらかを指定。(デフォルトはvalid=paddingなし)
    ※Conv2Dの入力は、(image_height, image_width, image_channels)という形状にする必要がある。
      →(バッチの次元を含まない)
    ※モノクロなら (28, 28, 1)、カラーならカラーなら(28,28, 3)のように指定する。
  • model.add(MaxPooling2D(pool_size=2,2)))
    ※Maxプーリング(2x2)の場合の定義
    ※パラメータは2つ、 pool_size, strides(省略するとpool_sizeと同じに設定)
    ※他にはAveragePoolingという手法もある。(https://keras.io/layers/pooling/
  • model.add(Flatten())
    ※多次元配列を1次元のベクトルに変換してくれるもの

 

分散表現

Embeddingはオブジェクトをベクトルにマップするので、アプリケーションはベクトル空間における類似性 (e.g., ユークリッド距離やベクトル間の角度) をオブジェクトの類似性の堅牢で柔軟な尺度として利用できる。

  • Embedding(正の整数(インデックス)を固定次元の密ベクトルに変換する)
    例)model.add(Embedding(20,10, input_length=5))
  • 自然言語での使い方
    Embedding(語彙数, 分散ベクトルの次元数, 文書の次元数))
    ※事前に入力文書の次元数をそろえる必要がある。
    model.add(Embedding(20,10, input_length=5))
     →入力長5、語録数20、分散ベクトルを10次元として、入力から出力(分散ベクトル10)を出力する。
  • Embeddingレイヤーはモデルの最初のレイヤーとしてのみ利用できる。

 

Tokenizer

テキストをベクトル化する、またはテキストをシーケンス化してくれるクラス。

サンプルコード

※辞書型のデータ(単語トークンのリスト)が生成される。{単語:キー}

One-hot表現への変換

ある値をOne-hot表現に変換したい場合にKerasのto_categoricalが便利です。
第1引数にリスト形式のデータ、num_classesにOne-hot表現の数を指定します。

以下、参考例です。

 

 

重みの正規化

KerasでL2正規化を適用する例

 

  • kernel_regularizer=regularizers.l2(0.001)
    →該当層の重み行列の係数ごとにネットワークの全損失に0.001*weight_coefficient_valueを足すことを意味している。
  • weight_coefficient_value=重み系数値
  • 同様にL1正規化を適用、L1,L2を同時に適用することもできる。
  • L1正規化を適用する場合
    → kernel_regularizer=regularizers.l1(0.001)
  • L1,L2正規化を同時適用する場合 
    regularizer=regularizers.l1_l2(l1=0.001,l2=0.001),

 

Dropアウト

通常Dropアウト率は0.2~0.5に設定する。

KerasでのDropアウトの適用例

 

Keras functional API

Functional APIは定義した層を任意に連結できる。
層の定義の最後に連結したい層の名前を()付きで書くと層が連結されていく。

input_1 = Input(shape=(None,))
name_2 = layers.Embedding()(input_1
name_3 = layers.LSTM(32)(name_2)
name_4 = layers.LSTM(32)(name_3)


2つの入力を元にLSTM層に入力して、結合して1つの出力を得るモデル定義の例

 

上記コードは、以下のネットワークを定義したことになる。

 

単一入力、多出力モデルの例

入力が1つ、A,B,C3つの出力を行うモデル定義の例

モデルのネットワークは以下の通り。

 

オートエンコーダで2入力、2出力を定義した場合の例

入力も出力も複数ある場合は、

 

のようにリストで入力、出力層の定義名を指定すればよい。

 

ネットワーク図は以下の通り。

トレーニングは、fitメソッドの入力、ラベル部分にリスト形式でデータを指定すればよい。

 

その他

 

pad_sequences

シーケンスを同じ長さになるように詰めてくれる機能。

  • padding: 文字列,'pre'または'post'.各シーケンスの前後どちらを埋めるか.
  • truncating: 文字列,'pre'または'post'.maxlenより長いシーケンスの前後どちらを切り詰めるか.

 

※参考コード

 

こちらの記事も参考になります。

 

おすすめの記事