2

Kerasで定義されていない特定のカーネルで畳み込みレイヤーを初期化します。次のようにKerasで任意のカーネルを使ってコンボリューション層を初期化する方法は?

def init_f(shape): 
     ker=np.zeros((shape,shape)) 
     ker[int(np.floor(shape/2)),int(np.floor(shape/2))]=1 
     return ker 

コンボリューション層が設計されています:

model.add(Conv2D(filters=32, kernel_size=(3,3), 
         kernel_initializer=init_f(3))) 

私はエラーを取得する:私は、以下の関数を定義する場合例えば、カーネルを初期化する「初期化子識別子を解釈できませんでした。」 。
私は同様の問題に続きました: https://groups.google.com/forum/#!topic/keras-users/J46pplO64-8 しかし私は自分のコードにそれを適用できませんでした。 Kerasで任意のカーネルを定義するのを手伝ってもらえますか?

ありがとうございます。

答えて

1

修正する項目がいくつかあります。カーネル初期化子から始めましょう。 the documentationから:

If passing a custom callable, then it must take the argument shape (shape of the variable to initialize) and dtype (dtype of generated values)

だから、署名になる必要があります。

def init_f(shape, dtype=None) 

機能がdtypeせずに動作しますが、それはそこにそれを維持することをお勧めします。

np.zeros(shape, dtype=dtype) 

また、これはあなたの第二の問題に対処します:shape引数はタプルであるので、あなたはただまっすぐnp.zerosにそれを渡す必要としませんあなたが例えば、あなたの関数の内部呼び出しにdtypeを指定することができますこの方法別のタプルを作る必要があります。

私はあなたがまたそれが受け取るどんな形で動作するようにあなたの関数を一般化できるよう、途中で1とカーネルを初期化しようとしている推測している:

ker[tuple(map(lambda x: int(np.floor(x/2)), ker.shape))]=1 

はそれをすべて一緒に置きます:

def init_f(shape, dtype=None): 
    ker = np.zeros(shape, dtype=dtype) 
    ker[tuple(map(lambda x: int(np.floor(x/2)), ker.shape))]=1 
    return ker 

最後に1つ問題があります。あなたは層ではなく、呼び出しの結果に機能を渡す必要があります:

model.add(Conv2D(filters=32, kernel_size=(3,3), 
        kernel_initializer=init_f)) 

レイヤ機能は、init_fに引数を渡します。

関連する問題