convolutional layer nach maxpooling layer

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
nichtSoGuter
User
Beiträge: 92
Registriert: Mittwoch 13. April 2022, 17:40

Wenn ich nach einem convolutional und maxpooling layer einen convolutional layer verwende, dann erscheint folgende fehlermeldung:
ValueError: Input 0 of layer "conv2d_48" is incompatible with the layer: expected axis -1 of input shape to have value 64, but received input with shape (None, 14, 14, 128)

Beispiel code:

Code: Alles auswählen

instanz = keras.layers.Conv2D(filters = 64, kernel_size =7 ,activation='relu', padding="SAME",
                        input_shape = [28,28,1])

output1 = instanz(input)
output1.shape  # shape ist: ([3, 28, 28, 64])

maxpool_instanz = MaxPooling2D(pool_size = 2)
output2 = maxpool_instanz(output1)
output2.shape # shape ist:  ([3, 14, 14, 64])

# bei dieser Zeile entsteht der code
output3 = instanz(output2)
Kann mir bitte jemand helfen bitte:-)
Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Zeig deinen gesamten Code und in welcher Reihenfolge du was machst. So ist der Code nicht lauffähig, input ist eine Python built-in function und sollte nicht als Variablenname verwendet werden.

Wie bereits an anderer Stelle erwähnt, ist es hilfreich beim arbeiten mit Jupyter regelmäßig den Kernel zu resetten.

conv2d_48 deutet darauf hin, dass da schon 47 andere conv2d layer erzeugt wurden. Das geht aus dem Code oben nicht hervor.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
nichtSoGuter
User
Beiträge: 92
Registriert: Mittwoch 13. April 2022, 17:40

vielen Dank für die Rückmeldung.
Wie resettet man den Kernel? Ich arbeite mit google colab. Dabei habe ich den code nochmal von vorne laufen lassen. Auch dann erhalte ich folgende Fehlermeldung:
ValueError: Input 0 of layer "conv2d_1" is incompatible with the layer: expected axis -1 of input shape to have value 64, but received input with shape (None, 14, 14, 128)
Daher befürchte ich, dass Ihre annahme mit dem resetten des Kernels nicht zur Problemlösung beiträgt

Mein vollständiger Code:
Mit dem folgenden Code (code1) habe ich eine Klasse für einen CNN block erstellt. diesen Block habe ich dann im unteren model (code2) verwendet.


code1:

Code: Alles auswählen

# Custom Convolutional Layer Block wird erstellt
class CNNBlock(keras.layers.Layer): # subclassing Layer to define inner computation blocks and Model to define the outer model
    def __init__(self, filters, kernel_size = 3, activation = "relu", padding = "same", pool_size =2, cnn_anzahl=1, **kwargs):
        super().__init__(**kwargs)
        # da schon normaliziert wurde, wird kein BN layer von mir verwendet
        self.cnnlayer = keras.layers.Conv2D(filters = filters, kernel_size = kernel_size, padding= padding)
        self.activationlayer = keras.layers.Activation(keras.activations.get(activation))
        self.poolinglayer = keras.layers.MaxPooling2D(pool_size)
        self.cnn_anzahl = cnn_anzahl
        
    def call(self, input_tensor):
        Z = input_tensor
        
        for i in range(self.cnn_anzahl):
            Z = self.cnnlayer(Z)
            Z = self.activationlayer(Z)
            
        Z = self.poolinglayer(Z)

code2:

Code: Alles auswählen

# Model mit dem Custom model Block
model = keras.models.Sequential([
    
    # einzelnes convolutional layer zu Beginn
    keras.layers.Conv2D(filters = 64, kernel_size =7 ,activation='relu', padding="SAME",
                        input_shape = [28,28,1]),
    MaxPooling2D(pool_size = 2),
    
    # 2 Custom Layer Blöcke
    CNNBlock(filters = 128, cnn_anzahl=2),
    CNNBlock(filters = 256, cnn_anzahl=2),
    
    # dense layer on top of the convolutional layer
    Flatten(),
    Dense(units = 128, activation = "relu"),
    Dropout(0.5), # bei CNN sollte man Dropout = 0.5 oder 0.4 verwenden
    
    Dense(units = 64, activation = "relu"),
    Dropout(0.5),
    
    Dense(units = 10, activation = "softmax"),
    
])

model.compile(loss = "sparse_categorical_crossentropy", optimizer = "nadam", metrics = ["accuracy"])
model.fit(X_train, y_train, epochs = 10, validation_data = (X_valid, y_valid))

Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Das Problem ist diese Klasse CNNBlock die imho ziemlich überflüssig und undurchsichtig ist. Und dadurch fehleranfällig.

Vermutlich soll jeweils das erzeugt werden was ich unter den auskommentierten Aufrufen eingefügt habe. Und da stellt sich mir die Frage, was sollen jeweils die beiden gleichen Conv2D Layer direkt untereinander? Bringt rein gar nichts.

Nun ja, ich vermute ist rein experimentell um zu schauen was für eine Accuracy da bei rumkommt. Ich habe auch viel ausprobiert und das gehört zum learning by doing.

Der Code hier läuft ohne Fehlermeldung.

Edit: Fast vergessen, In Colab heißt "Kernel resetten" "Laufzeit neu starten" und kann mit CTRL-M . durchgeführt werden.

Code: Alles auswählen

# Model mit dem Custom model Block
model = keras.models.Sequential([
    
    # einzelnes convolutional layer zu Beginn
    keras.layers.Conv2D(filters=64, kernel_size=7, activation='relu', padding="same", input_shape = [28,28,1]),
    keras.layers.MaxPooling2D(pool_size = 2),
    
    # 2 Custom Layer Blöcke
    #CNNBlock(filters = 128, cnn_anzahl=2),
    keras.layers.Conv2D(filters=128, kernel_size=3, activation="relu", padding="same"),
    keras.layers.Conv2D(filters=128, kernel_size=3, activation="relu", padding="same"),
    keras.layers.MaxPooling2D(2),

    #CNNBlock(filters = 256, cnn_anzahl=2),
    keras.layers.Conv2D(filters=256, kernel_size=3, activation="relu", padding="same"),
    keras.layers.Conv2D(filters=256, kernel_size=3, activation="relu", padding="same"),
    keras.layers.MaxPooling2D(2),
    
    # dense layer on top of the convolutional layer
    keras.layers.Flatten(),
    keras.layers.Dense(units=128, activation="relu"),
    keras.layers.Dropout(0.5),
    
    keras.layers.Dense(units=64, activation="relu"),
    keras.layers.Dropout(0.5),
    
    keras.layers.Dense(units=10, activation="softmax"),
    
])

model.compile(loss="sparse_categorical_crossentropy", optimizer="nadam", metrics=["accuracy"])
model.summary()
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
nichtSoGuter
User
Beiträge: 92
Registriert: Mittwoch 13. April 2022, 17:40

Vielen Dank für Ihre Antwort. Das hilft mir wirklich sehr.

In dem Buch mit dem ich lerne werden sehr oft gleiche Conv2D Layer untereinander verwendet. Weshalb das genau gemacht wird, weiß ich leider selber nicht. Wird im Buch leider auch nicht begründet.

Bei einem Resnet-34 Model werden doch auch gleiche Conv2D layer untereinander verwendet. Macht man das heutzutage nicht mehr?

Ist es dann besser einen Layer mit der Doppelten filteranzahl zu verwenden?
Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Ich bin nicht mehr so in der Materie, ist über 2 Jahre her das ich mich damit beschäftigt habe.

Resnet-34 ist aber von 1015 und war schon vor 2 Jahren ein Dinosaurier.

Hier ist jemand der ziemlich auf den aktuellsten Stand der Dinge ist, technische Paper analysiert, etc etc
https://www.youtube.com/c/YannicKilcher/playlists

Ist aber auf englisch, wie 95% der guten Videos über AI.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten