2017-09-14 99 views
0

我一直在試圖解決這個問題,目前爲止已經有24個小時了,但不幸的是不能拿出一些東西。從RGB圖像的綠色通道培訓Keras CNN模型

問題很簡單:我在2個子目錄中有2個類別,子目錄中的圖像是RGB格式,但我只對綠色通道感興趣。我讀使用flow_from_directory函數圖像的批次(影像尺寸@(3224224)),那麼我想如下提取使用lambda層綠色通道:

def get_model_bw(input_shape=(3,224,224), classes = 2, lr=1e-4): 
    model = Sequential([ 
     Lambda(lambda x: x[:,1,:,:], input_shape=input_shape, output_shape=(1,224,224)), 
     BatchNormalization(axis=1), 
     Conv2D(32,(3,3), activation='relu',padding='same'), 
     BatchNormalization(axis=1), 
     Conv2D(32,(3,3), activation='relu',padding='same'), 
     BatchNormalization(axis=1), 
     Conv2D(32,(3,3), activation='relu',padding='same'), 
     BatchNormalization(axis=1), 
     MaxPooling2D(), 
     Conv2D(64,(3,3), activation='relu',padding='same'), 
     BatchNormalization(axis=1), 
     Conv2D(64,(3,3), activation='relu',padding='same'), 
     BatchNormalization(axis=1), 
     Conv2D(64,(3,3), activation='relu',padding='same'), 
     BatchNormalization(axis=1), 
     MaxPooling2D(), 
     Conv2D(128,(3,3), activation='relu',padding='same'), 
     BatchNormalization(axis=1), 
     Conv2D(128,(3,3), activation='relu',padding='same'), 
     BatchNormalization(axis=1), 
     MaxPooling2D(), 
     Conv2D(256,(3,3), activation='relu',padding='same'), 
     BatchNormalization(axis=1), 
     Conv2D(256,(3,3), activation='relu',padding='same'), 
     BatchNormalization(axis=1), 
     MaxPooling2D(), 
     Conv2D(512,(3,3), activation='relu',padding='same'), 
     BatchNormalization(axis=1), 
     Conv2D(512,(3,3), activation='relu',padding='same'), 
     BatchNormalization(axis=1), 
     MaxPooling2D(), 
     Flatten(), 
     Dense(1000, activation='relu'), 
     BatchNormalization(), 
     Dense(1000, activation='relu'), 
     BatchNormalization(), 
     Dense(classes, activation='softmax') 
     ]) 
    model.compile(Adam(lr=lr), loss='categorical_crossentropy', metrics=['accuracy']) 
    return model 

model_bw = get_model_bw(input_shape=(3,224,224), classes=2) 

但它只是拒絕工作...... ,它的投擲的錯誤是:

ValueError異常回溯(最近通話最後一個) ValueError異常:輸入0與層batch_normalization_181不相容:預計NDIM = 4,發現NDIM = 3

有什麼建議? P.S.我使用Theano後端和最新的keras版本。

任何幫助將不勝感激。

+0

請以「拒絕工作」給你的意思的細節。包括可能的錯誤消息。 –

+0

您必須發佈錯誤消息,以便人們可以瞭解正在發生的事情。 –

+0

謝謝,我添加了錯誤信息。 –

回答

0

首先,您必須檢查您是否使用數據格式channels_firstchannels_last。 (看起來你首先使用通道,通過輸入形狀)

Keras的默認值是channels_last。您可以在用戶文件夾中的keras.json文件中看到:<user>\.keras\keras.json。這也可以爲每個圖層單獨設置。

拉姆達層

當您使用層以外的形狀的工作,如input_shape=(3,224,224),不指定批量大小(圖像的數量)。

但拉姆達層(只要您直接在張量工作)內,批量大小將顯示爲第一個維度,那麼,你的渠道是不是在第一個維度,但在第二:

Lambda(lambda x: x[:,1,:,:], input_shape=input_shape, output_shape=outputshape) 

當然,你的輸出形狀是不一樣的輸入形狀,它必須是(1,224,224)

以下層:

不要添加input_shape至其他層,僅在第一層(它是拉姆達層)


,顯示錯誤消息,如果出現任何錯誤。

+0

謝謝。我正在使用channel_first。我編輯了我的原始文章並添加了錯誤消息。它仍然不起作用 –

0

我不能相信,但我找到了解決辦法:

拉姆達層:

from keras import backend as K 
Lambda(lambda x: K.expand_dims(x[:,1,:,:],1), input_shape=input_shape, output_shape=(1,224,224)),