2017-07-06 15 views
0

レイヤーを使用する関数でLambdaレイヤーを定義しています。Keras:Lambda関数内のConv2Dレイヤーのバニシングパラメータ

def lambda_func(x,k): 
    y = Conv2D(k, (3,3), padding='same')(x) 
    return y 

そして

k = 64 
x = Conv2D(k, (3,3), data_format='channels_last', padding='same', name='block1_conv1')(inputs) 
y = Lambda(lambda_func, arguments={'k':k}, name = 'block1_conv1_loc')(x) 

を使用して、それを呼び出すしかしmodel.summary()で、ラムダ層がパラメータを示していません!

_________________________________________________________________ 
Layer (type)     Output Shape    Param # 
================================================================= 
input_1 (InputLayer)   (None, 224, 224, 3)  0   
_________________________________________________________________ 
block1_conv1 (Conv2D)  (None, 224, 224, 64)  1792  
_________________________________________________________________ 
block1_conv1_loc (Lambda) (None, 224, 224, 64)  0   
_________________________________________________________________ 
activation_1 (Activation) (None, 224, 224, 64)  0   
_________________________________________________________________ 
block1_pool (MaxPooling2D) (None, 112, 112, 64)  0   
_________________________________________________________________ 
flatten (Flatten)   (None, 802816)   0   
_________________________________________________________________ 

(その下Dense層、およびその下Softmax 2クラス分類器があります)。 LambdaレイヤのConv2Dパラメータが確実に表示され、トレーニングも可能ですか?私はまた、Lambda機能でtrainable=Trueを使ってみました。

def lambda_func(x,k): 
    y = Conv2D(k, (3,3), padding='same', trainable=True)(x) 
    return y 

しかし、それは何の違いもありませんでした。

+0

どのモデルでどのように 'summary()'を呼びますか? – DarkCygnus

+0

私は標準的な手順を使用しています。 'model = my_model(weights_path = 'weights.h5')'ここで私は 'Model' APIで' my_model'を定義しました。モデルをコンパイルするために 'model.compile(optimizer = 'RMSprop'、loss = 'binary_crossentropy'、メトリクス= ['精度'))'を呼び出し、その構造を見て 'model.summary()'を呼び出します。 – Prabaha

答えて

2

ラムダレイヤーにはパラメータがありません。

パラメータは、要約では、「学習」できる変数です。ラムダレイヤーは決して学ばない、彼らはあなたによって作成された関数です。

「畳み込みレイヤー」を使用する場合は、ラムダレイヤーの外側で使用してください。
"コンボリューション演算"を使用してラムダレイヤー内で使用したいが、学習可能なパラメーターがない場合は、フィルターを自分で定義する。

異なる方法で学習する特別なレイヤーを作成する場合は、カスタムレイヤーを作成します。

+0

I実際には、前のレイヤーの一部だけを新しいコンボリューションレイヤーにフィードしたいと思っています(この質問のように投稿しました)(https://stackoverflow.com/questions/44809247/keras-feeding-in-part-of-previous-layer -to-next-layer-in-cnn)。ラムダレイヤーを使ってその作業を試みました。以前のレイヤーの出力の一部を取り込むカスタムレイヤーを定義するにはどうしたらいいですか? – Prabaha

+1

@Danielによって提案されているように、[この回答](https://stackoverflow.com/questions/44809247/keras-feeding)のように、 'Lambda'レイヤーの外にある' Conv2D'レイヤーを使って、実際に解決することができます。 -in-of-part-of-previous-layer-to-next-layer-in-cnn/44960774#44960774)。 – Prabaha

関連する問題