Keras : Models : Keras モデルについて

Keras : Models : Keras モデルについて (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 06/19/2018 (2.2.0)

* 本ページは、Keras 本家サイトの – Models : About Keras models を翻訳した上で適宜、補足説明したものです:

* Keras 本家サイトには日本語訳も用意されていますが、それとは無関係に翻訳したものです。
* サンプルコードの動作確認はしておりますが、適宜、追加改変している場合もあります。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

本文

Keras で利用可能なモデルの 2 つの主要な型があります : Sequential モデル、そして functional API で使用される Model クラス です。

これらのモデルは多くの共通のメソッドと属性を持ちます :

  • model.layers はモデルを構成する層の平坦なリストです。
  • model.inputs はモデルの入力 tensor のリストです。
  • model.outputs はモデルの出力 tensor のリストです。
  • model.summary() はモデルの要約表現をプリントします。utils.print_summary のショートカットです。
  • model.get_config() はモデルの configuration を含む辞書を返します。モデルはその config から次を通して再インスタンス化できます :
    config = model.get_config()
    model = Model.from_config(config)
    # or, for Sequential:
    model = Sequential.from_config(config)
    
  • model.get_weights() はモデルの総ての重み tensor のリストを Numpy 配列として返します。
  • model.set_weights(weights) はモデルの重みの値を Numpy 配列のリストから設定します。リストの配列は get_weights() で返されたものと同じ shape を持つべきです。
  • model.to_json() はモデルの表現を JSON 文字列として返します。この表現はアーキテクチャだけで、重みを含まないことに注意してください。JSON 文字列から次を通して (再初期化された重みを持つ) 同じモデルを再インスタンス化できます :
    from keras.models import model_from_json
    
    json_string = model.to_json()
    model = model_from_json(json_string)
    
  • model.to_yaml() はモデルの表現を YAML 文字列として返します。この表現はアーキテクチャだけで、重みを含まないことに注意してください。YAML 文字列から次を通して (再初期化された重みを持つ) 同じモデルを再インスタンス化できます :
    from keras.models import model_from_yaml
    
    yaml_string = model.to_yaml()
    model = model_from_yaml(yaml_string)
    
  • model.save_weights(filepath) はモデルの重みを HDF5 ファイルとしてセーブします。
  • model.load_weights(filepath, by_name=False) はモデルの重みを (save_weights で作成された) HDF5 ファイルからロードします。デフォルトでは、アーキテクチャは変更されていないことを想定しています。(共通の幾つかの層を伴う) 異なるアーキテクチャに重みをロードするためには、同じ名前を持つ層だけをロードするために by_name=True を使用します。

 

モデルのサブクラス化

モデルのこれらの 2 つのタイプに加えて、Model クラスをサブクラス化して call メソッド内の forward パスを実装することにより貴方自身の完全にカスタマイズ可能なモデルを作成しても良いです (Model サブクラス化 API は Keras 2.2.0 で導入されました)。

ここに Model サブクラスとして書かれた単純な多層パーセプトロン・モデルの例があります :

import keras

class SimpleMLP(keras.Model):

    def __init__(self, use_bn=False, use_dp=False, num_classes=10):
        super(SimpleMLP, self).__init__(name='mlp')
        self.use_bn = use_bn
        self.use_dp = use_dp
        self.num_classes = num_classes

        self.dense1 = keras.layers.Dense(32, activation='relu')
        self.dense2 = keras.layers.Dense(num_classes, activation='softmax')
        if self.use_dp:
            self.dp = keras.layers.Dropout(0.5)
        if self.use_bn:
            self.bn = keras.layers.BatchNormalization(axis=-1)

    def call(self, inputs):
        x = self.dense1(inputs)
        if self.use_dp:
            x = self.dp(x)
        if self.use_bn:
            x = self.bn(x)
        return self.dense2(x)

model = SimpleMLP()
model.compile(...)
model.fit(...)

層は __init__(self, …) 内で定義されて forward パスは call(self, inputs) 内で指定されます。call 内では、(カスタム層内で行なうように) self.add_loss(loss_tensor) を呼び出してカスタム損失を指定することもできます。

サブクラス化されたモデルでは、モデルのトポロジーは (層の静的グラフではなく) Python コードとして定義されます。それはモデルのトポロジーが調査やシリアライズされないことを意味します。その結果、次のメソッドと属性はサブクラス化されたモデルでは利用できません :

  • model.inputs と model.outputs.
  • model.to_yaml() と model.to_json()
  • model.get_config() と model.save().

キー・ポイント: ジョブに対して正しい API を使用してください。Model サブクラス化 API は複雑なモデルを実装するためのより素晴らしい柔軟性を提供できますが、犠牲もあります (これらの欠落した特徴に加えて) : それはより verbose で、より複雑で、そしてユーザ・エラーの機会も多く持ちます。できれば、functional API を使用することを選択してください、それはよりユーザ・フレンドリーです。

 

以上