カスタムレイヤのパラメータをエクスポートする - DigitalMediaProfessionals/dv-sdk GitHub Wiki

標準的でない層を使うことで、多くの深層学習フレームワークを容易に拡張できます。しかしそうした層を使ったネットワークを直列化したとき、パラメータが不足することがある。そのため、直列化してパラメータをエクスポートする際には、非標準的な層の実装を修正する必要があります

例: Keras のSSD ネットワークにおけるPriorBox 層

PriorBox 層の元の実装は次の通りです。

class PriorBox(Layer):
    def __init__(self, img_size, min_size, max_size=None, aspect_ratios=None,
                 flip=True, variances=[0.1], clip=True, **kwargs):
	# initialization
	# ...
    def compute_output_shape(self, input_shape):
	# implementation
	# ...
    def call(self, x, mask=None):
	# implementation
	# ...

元の実装はオンラインモデルとして実行された際には正しく動作します。 しかしネットワークがオフラインのネットワークモデルファイルに保存されたとき、必要なパラメータは保存されません。 そのため、そのネットワークがファイルから読み込まれて使われたとき、適切には動きません。 さらに、ネットワーク変換ツールはそのファイルを正しく扱えません。

幸運なことに、Keras ではこの問題の修正はget_config() メンバ関数を定義するだけで簡単にできます。 するとKeras は自動的に必要なパラメータをオフラインネットワークモデルファイルに保存し、そのネットワークを復元して正しく初期化できるようになります。 PriorBox 層の場合は下記のように実装します。

class PriorBox(Layer):
	# ...
    def get_config(self):
        config = {
            'img_size': self.img_size,
            'min_size': self.min_size,
            'max_size': self.max_size,
            'flip': False,
            'aspect_ratios': self.aspect_ratios,
            'variances': list(self.variances),
            'clip': self.clip
        }
        base_config = super(PriorBox, self).get_config()
        return dict(list(base_config.items()) + list(config.items()))
	# ...

カスタムレイヤの直列化については本ドキュメントの範囲外ですので、詳しくはKeras のドキュメントをご参照ください。 また、ネットワーク変換ツールでオフラインモデルファイルを処理する前に、必要なパラメータがすべて直列化されていることを確認してください。