2017-06-29 8 views
1

Also ich versuche, meine eigene Schicht in Keras zu implementieren, das bereitgestellte Beispiel mit:Warum wird die Call-Methode bei der Erstellung in Keras Schichten aufgerufen wird

class MyLayer(Layer): 

    def __init__(self, output_dim, **kwargs): 
     self.output_dim = output_dim 
     super(MyLayer, self).__init__(**kwargs) 

    def build(self, input_shape): 
     # Create a trainable weight variable for this layer. 
     self.kernel = self.add_weight(name='kernel', 
             shape=(input_shape[1], self.output_dim), 
             initializer='uniform', 
             trainable=True) 
     super(MyLayer, self).build(input_shape) # Be sure to call this somewhere! 

    def call(self, x): 
     return K.dot(x, self.kernel) 

    def compute_output_shape(self, input_shape): 
     return (input_shape[0], self.output_dim) 

Ich habe bemerkt, dass das, was in Call ist bei aufgerufen wird Zeit bauen, wenn ich tun:

model.add(MyLayer(4, input_dim=(1)) 

Dies geschieht, ohne fit, Zug zu nennen, vorhersagen, etc ...

Warum?

Antwort

0

Sie wird zu dem Zeitpunkt aufgerufen, zu dem Sie die Ebene zum Modell hinzugefügt haben, um zu überprüfen, ob die Form gültig ist oder nicht.

Wenn Sie sehen möchten, wo es genannt wird, den Code ändern:

import sys 
import traceback 

class MyLayer(Layer): 
    .... 
    def call(self, x): 
     traceback.print_stack(file=sys.stdout) 
     return K.dot(x, self.kernel) 
+0

ok, ich vermuten, dass es ein Scheck Anruf war, gut zu wissen – gotch4

Verwandte Themen