2017-07-06 22 views
0

我正在使用Conv2D圖層定義一個具有函數的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',metrics = ['accuracy'])'編譯模型,然後'model.summary()'查看其結構 – Prabaha

回答

2

Lambda圖層沒有參數。

參數在總結中是可以「學習」的變量。 Lambda圖層從不學習,它們是您創建的函數。

如果您打算使用「卷積層」,請在lambda層外部使用它。
現在,如果你想使用「卷積運算」,然後在lambda層中使用它,但沒有可學習的參數,你可以自己定義濾波器。

如果要創建以不同方式學習的特殊圖層,請創建一個自定義圖層。

+0

I實際上希望僅將前一層的一部分饋送到新的卷積層,[就像我發佈的這個問題](https://stackoverflow.com/questions/44809247/keras-feeding-in-part-of-previous-layer -to-下一層功能於CNN)。我嘗試使用Lambda層來完成這項工作。我怎樣才能定義一個只包含前一層輸出的一部分的自定義層,比如說只輸出1個內核的輸出,而不是所有的輸出? – Prabaha

+1

正如@Daniel所建議的那樣,通過在'Lambda'層之外使用'Conv2D'層可以達到這個解決方案,就像[這個答案]一樣(https://stackoverflow.com/questions/44809247/keras-feeding -in-部分的在先層到下一層功能於CNN/44960774#44960774)。 – Prabaha