2017-09-14 81 views
3

我很想獲得關於以下挑戰的見解和觀點。我試圖訓練一個CNN來對具有不同「顏色塊」的圖像進行分類(請參見下面的示例)。圖像是二維數組(例如20乘100像素),其中白色編碼爲0,藍色編碼爲1,綠色編碼爲2.CNN:認識簡單街區的挑戰

我掙扎 - 有點令我驚訝 - 訓練一個性能良好的網絡這些類型的圖像 - 特別是在圖像尺寸變大時(例如40乘100),以防止驗證集上的過度擬合和非常差的性能。我試圖理解/概念化需要什麼類型的CNN結構來識別這些類型的功能。

我已經在下面列出了我目前的網絡結構 - 但是這種結構往往有混合的性能,並且在圖像大小增加時失敗或變得非常慢。我認爲,網絡必須從上到下看到整個青色「塊」,才能做出準確的分類。

我很想得到有關這樣做的最佳方法的想法。是向網絡添加更多圖層的最佳方法?或者使用更大的卷積窗口?或者添加更多的轉化。過濾到每一層(例如從64到96等)?我覺得自己在基礎層面上做錯了什麼。

想法和觀點非常讚賞。

model = Sequential() 
model.add(Conv2D(64, (3, 3), input_shape=input_shape)) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Dropout(0.25)) 

model.add(Conv2D(64, (3, 3))) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Dropout(0.25)) 

model.add(Flatten()) 
model.add(Dropout(0.25)) 
model.add(Dense(1,activation="sigmoid")) 

opt = keras.optimizers.rmsprop(lr=0.001, decay=1e-5) 
model.compile(loss='binary_crossentropy',optimizer=opt,metrics=['accuracy']) 

enter image description here

+1

只是爲了正確理解您的挑戰:您已經在數據中編碼了結果(任何發生的綠色像素=正面(1))。你爲什麼要訓練一個神經網絡,而不是簡單地檢查圖像中的綠色? – petezurich

+1

爲什麼最後一張圖片是否定的? –

+1

如果問題與以不同顏色查找一個塊一樣簡單,那麼您可能只需要非常少的過濾器(如1或2)以及幾個圖層。這個問題很簡單,可以在沒有神經網絡的情況下解決。 –

回答

1

所以才向你展示你的設計中有兩個可能的問題和一些可能的解決方案:

  1. 感受野網絡的太小:讓我們來分析你的關於來自給定層的濾波器看到的原始圖片的大小的網絡

    model = Sequential() 
    model.add(Conv2D(64, (3, 3), input_shape=input_shape)) # RF size = (3, 3) 
    model.add(Activation('relu')) 
    model.add(MaxPooling2D(pool_size=(2, 2))) # RF size = (4, 4) 
    model.add(Dropout(0.25)) 
    
    model.add(Conv2D(64, (3, 3))) # RF size = (6, 6) 
    model.add(Activation('relu')) 
    model.add(MaxPooling2D(pool_size=(2, 2))) # RF size = (7, 7) 
    model.add(Dropout(0.25)) 
    ... 
    

    因此,從您的網絡獲取信號的字段的最大大小遠小於圖片的大小(其高度似乎爲10)。

    爲了克服這個問題 - 你可以增加第一層中的濾鏡尺寸,使其高度等於圖片的高度(因此基本上使用了相當於1D卷積的東西)。

  2. Flatten是一個壞主意:當您使用Flatten - 網絡實際上考慮到圖片上的不同圖案的位置 - 所以如即使它們是相同的對象,它也需要區分左側的完整塊和右側的完整塊。克服這個問題的最佳選擇是使用GlobalMaxPooling2D,這是最好的檢測圖像上的模式(假設過濾器尺寸足夠大)。