Param# Spalte von model.summary() bei Conv2D layer den Wert 0

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

ich habe folgenden Custom layer erstellt (siehe Codeblock 1) und anschließend im im Codeblock 2 verwendet. Das Problem ist, dass bei der Param# Spalte der .summary() methode die Anzahl der Parameter bei meinem Custom Layer wohl 0 ist. Ich finde meinen Fehler jedoch leider nicht,

Codeblock 1: (Mein Custom Layer wird erstellt)

Code: Alles auswählen

class ResidualUnit(keras.layers.Layer):
  def __init__(self, filters, strides=1, activation = "relu", **kwargs):
    super().__init__(**kwargs)
    self.activation = keras.activations.get(activation)
    self.main_layers= [
                       Conv2D(filters = filters, kernel_size = 3,
                                           strides = strides, padding = "SAME", 
                                           use_bias = False),
                       
                       BatchNormalization(),
                       self.activation,

                       Conv2D(filters = filters, kernel_size = 3,
                                           strides = strides, padding = "SAME", 
                                           use_bias = False),
                       BatchNormalization()
    ]
    
    self.skip_layers = [] # ist leere liste
    if strides > 1: # wenn strides > 1, dann self.skip_layers nicht leere liste
      self.skip_layers = [
                          Conv2D(filters = filters, kernel_size = 1,
                                              strides = strides, padding = "SAME",
                                              use_bias = False),
                          BatchNormalization()
      ]

    def call(self, inputs):
      Z = inputs
      for layer in self.main_layers:
        Z = layer(Z)
      
      skip_Z = inputs
      for layer in self.skip_layers:
        skip_Z = layer(skip_Z)

      return self.activation(Z + skip_Z)

Codeblock 2: (Model mit meinem Custom Layer wird erstellt)

Code: Alles auswählen

resnet_model = Sequential([
                           Conv2D(filters= 64, kernel_size = 7, strides=2, 
                                  padding = "SAME", input_shape = [224, 224, 3]),
                           BatchNormalization(),
                           Activation("relu"),
                           MaxPool2D(pool_size = 3, strides = 2, padding = "SAME")
])

previous_filters = 64

for filters in [64]*3 + [128]*4 + [256]*6 + [512]*3 :
  strides = 1 if filters == previous_filters else 2
  resnet_model.add(ResidualUnit(filters, strides = strides)) # HIER: wird Custom Layer verwendet
  previous_filters = filters

resnet_model.add(GlobalAvgPool2D())
resnet_model.add(Flatten())
resnet_model.add(Dense(10, activation = "softmax"))

print(resnet_model.summary())

nichtSoGuter
User
Beiträge: 92
Registriert: Mittwoch 13. April 2022, 17:40

Mir ist noch etwas aufgefallen. Die filteranzahl für meinen Custom layer (ResidualUnit) ist durchgängig bei 64. Die zählvariable "filters" der for schleife verändert zwar ihren wert. das wird aber leider nicht für meinem Custom layer ResidualUnit übernommen? Wieso aber nicht? die zählvariable "filters" wird mit dem Parameter "filters" des Custom Layers gleichgesetzt. Wenn sich die zählvaribale ändert (was sie tatsächlich tut), dann müsste sich doch auch der Parameter "filters " des Custom Laysers tun. Das tut der Paramter jedoch nicht.
Antworten