2017-09-14 7 views
3

私は次のチャレンジについて洞察と見方を得たいと思っています。私はCNNを訓練して、異なる色の別個の「ブロック」を持つ画像を分類しようとしています(下の例を参照してください)。画像は、白色が0、青色が1、緑色が2次元の2次元配列です(例:20×100ピクセル)。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つのブロックを見つけるのと同じくらい簡単な場合は、おそらく1または2などの非常に少ないフィルタと少数のレイヤしか必要としないでしょう。この問題は、ニューラルネットワークなしで解くだけの単純さです。 –

答えて

1

だから、あなたのデザインといくつかの可能な解決策を持つ2つの可能性のある問題を示すために:

  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を使用することです。

関連する問題