5

Ich bin in der Lage, eine U-net mit beschrifteten Bildern, die eine binäre Klassifizierung haben, zu trainieren.Wie implementiert man semantische Multi-Klassen-Segmentierung?

Aber ich habe eine harte Zeit herauszufinden, wie die endgültigen Schichten in Keras/Theano für Multi-Klasse-Klassifizierung (4 Klassen) zu konfigurieren.

Ich habe 634 Bilder und entsprechende 634 Masken, die unit8 und 64 x 64 Pixel sind.

Meine Masken, statt schwarz zu sein (0) und Weiß (1), hat Farbe markierte Objekte in 3 Kategorien und Hintergrund wie folgt:

  • schwarz (0), Hintergrund
  • rot (1), Objektklasse 1
  • grün (2), Objektklasse 2
  • gelb (3), Objektklasse 3

Vor Trainingsläufen, wobei die Anordnung enthält Masken ist ein heiß wie folgt codiert:

mask_train = to_categorical(mask_train, 4) 

Dies macht mask_train.shape von (634, 1, 64, 64) zu (2596864, 4) gehen.

Mein Modell folgt genau der Unet-Architektur, aber die letzten Schichten scheinen problematisch zu sein, da ich die Struktur nicht abflachen kann, um sie dem One-Hot-kodierten Array anzupassen.

[...] 
up3 = concatenate([UpSampling2D(size=(2, 2))(conv7), conv2], axis=1) 
conv8 = Conv2D(128, (3, 3), activation='relu', padding='same')(up3) 
conv8 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv8) 

up4 = concatenate([UpSampling2D(size=(2, 2))(conv8), conv1], axis=1) 
conv9 = Conv2D(64, (3, 3), activation='relu', padding='same')(up4) 
conv10 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv9) 

# here I used number classes = number of filters and softmax although 
# not sure if a dense layer should be here instead 
conv11 = Conv2D(4, (1, 1), activation='softmax')(conv10) 

model = Model(inputs=[inputs], outputs=[conv11]) 

# here categorical cross entropy is being used but may not be correct 
model.compile(optimizer='sgd', loss='categorical_crossentropy', 
       metrics=['accuracy']) 

return model 

Haben Sie Vorschläge, wie Sie die letzten Teile des Modells ändern können, damit dies erfolgreich trainiert wird? Ich erhalte eine Vielzahl von Fehlern bei der Formübereinstimmung, und die wenigen Male, die ich es schaffte, es laufen zu lassen, änderte sich der Verlust während Epochen nicht.

Antwort

2

Sie sollten Ihr Ziel als (634,4,64,64) haben, wenn Sie channels_first verwenden.
Oder (634,64,64,4) wenn channels_last.

Jeder Kanal Ihres Ziels sollte eine Klasse sein. Jeder Kanal ist ein Bild von 0 und 1, wobei 1 bedeutet, dass Pixel die Klasse ist und 0 bedeutet, dass Pixel nicht diese Klasse ist.

Dann ist Ihr Ziel 634 Gruppen, jede Gruppe enthält vier Bilder, jedes Bild hat 64x64 Pixel, wobei Pixel 1 das Vorhandensein der gewünschten Funktion anzeigen.

Ich bin nicht sicher, dass das Ergebnis richtig bestellt, aber man kann versuchen:

mask_train = to_categorical(mask_train, 4) 
mask_train = mask_train.reshape((634,64,64,4)) 
#I chose channels last here because to_categorical is outputing your classes last: (2596864,4) 

#moving the channel: 
mask_train = np.moveaxis(mask_train,-1,1) 

Wenn die Bestellung nicht richtig funktioniert, können Sie es manuell tun:

newMask = np.zeros((634,4,64,64)) 

for samp in range(len(mask_train)): 
    im = mask_train[samp,0] 
    for x in range(len(im)): 
     row = im[x] 
     for y in range(len(row)): 
      y_val = row[y] 
      newMask[samp,y_val,x,y] = 1 
+0

I verwende das Theano-Back-End, also Kanäle zuerst - denkst du, dass die letzten Schichten in meinem Modell korrekt erscheinen? – pepe

+0

Was definiert, wenn Kanäle zuerst oder zuletzt sind, ist "keras", nicht theano. Der Standardwert ist Kanäle zuletzt. –

+0

ja, aber ich habe meine Keras richtig für Theano in .keras.json eingerichtet, so hat sich mein Anliegen an das Modell gewandt, da ich unsicher bin, wie es in der Endphase geformt werden sollte – pepe