2016-09-17 14 views
3

に設定されているとき、私はTF 『Keras'に設定image_dim_orderingプロパティ』を持っているので、私はこのように私のモデルを定義します。ロードの重みkerasがTF形式に

model = Sequential() 
model.add(ZeroPadding2D((1, 1), input_shape=(224, 224, 3))) 
model.add(Convolution2D(64, 3, 3, activation='relu')) 

しかし、私はload_weightsメソッドを呼び出したときに、それ

Exception: Layer weight shape (3, 3, 3, 64) not compatible with provided weight shape (64, 3, 3, 3) 

どのように私はこれらの重みをロードし、自動的にTensorflowのフォーマットを修正するためにそれらを移調することができます:クラッシュ私のモデルは「目」の形式を使用して保存されましたので?

答えて

7

私はこれについてフランソワCholletを尋ねた(彼はSOアカウントを持っていません)と、彼は親切に、この返信渡さ:


「目」のフォーマットは、畳み込みカーネルは形状(深さを持っていることを意味します、input_depth、行、colsの)

「TF」フォーマットは、畳み込みカーネルの形状(行、COLS、input_depth、深さを有することを意味する)

したがってあなたはnp.transpose(x, (2, 3, 1, 0))場所を介して後に元から変換することができxはtの値彼は畳み込みカーネルです。ここ

は、変換を行うためのいくつかのコードは次のとおり

from keras import backend as K 

K.set_image_dim_ordering('th') 

# build model in TH mode, as th_model 
th_model = ... 
# load weights that were saved in TH mode into th_model 
th_model.load_weights(...) 

K.set_image_dim_ordering('tf') 

# build model in TF mode, as tf_model 
tf_model = ... 

# transfer weights from th_model to tf_model 
for th_layer, tf_layer in zip(th_model.layers, tf_model.layers): 
    if th_layer.__class__.__name__ == 'Convolution2D': 
     kernel, bias = layer.get_weights() 
     kernel = np.transpose(kernel, (2, 3, 1, 0)) 
     tf_layer.set_weights([kernel, bias]) 
    else: 
     tf_layer.set_weights(tf_layer.get_weights()) 

モデルはConvolution2D層の下流に緻密層を含む場合には、最初の緻密層の重み行列も同様にシャッフルする必要があろう。

+1

これは今のようではありません。 TheanoとTensorFlowの両方のウェイトは同じです。 「Th」から「TF」に変換する場合(またはその逆の場合)、寸法1および2(すなわち、「入力深さ」および「深度」)を反転する必要があります。なぜそういうことが分かりますか? ThからTF(またはその逆)のkernel_conversion関数を見たい場合は、[ここ](https://github.com/fchollet/keras/blob/master/keras/utils/conv_utils.py#L67-L87)を見てください。 。 –

関連する問題