2016-11-08 4 views
0

ich eine Python-Funktion aufrufen Weg in Keras' Tutorial wie das sah:Bedeutung der Funktion in Python aufrufen?

from keras.layers import Input, Dense 
from keras.models import Model 

# this returns a tensor 
inputs = Input(shape=(784,)) 

# a layer instance is callable on a tensor, and returns a tensor 
x = Dense(64, activation='relu')(inputs) 

Allerdings habe ich keine Ahnung, was die Bedeutung der Funktionsaufruf Form ist:

x = Dense(64, activation='relu')(inputs) 

Warum ist es "(Eingänge)" außerhalb der Klammer der Funktion "Dichte" Parameterliste?

+1

Mögliches Duplikat [? Was ist ‚Currying‘] (http://stackoverflow.com/questions/36314/what-is- currying) –

Antwort

5

Weil Dense(...) eine aufrufbar (im Grunde eine Funktion) zurückgibt, so kann es wiederum aufgerufen werden. Hier ist ein einfaches Beispiel:

def make_adder(a): 
    def the_adder(b): 
     return a + b 
    return the_adder 

add_three = make_adder(3) 
add_three(5) 
# => 8 

make_adder(3)(5) 
# => 8 

Hier make_adder(3) gibt die Funktion, die als

def the_adder(b) 
    return 3 + b 

dann diese Funktion aufrufen mit dem Argument definiert ist 5 kehrt 8. Wenn Sie den Schritt der Zuweisung des Rückgabewerts make_adder(3) an eine separate Variable überspringen, erhalten Sie das Formular, über das Sie gefragt haben: make_adder(3)(5) ist das gleiche wie Dense(64, activation='relu')(inputs) aus Ihrer Frage.

EDIT: Technisch Dense ist nicht als eine Funktion in Python klassifiziert, sondern als eine Klasse; Dense(...) ist somit ein Aufruf eines Konstruktors. Die betreffende Klasse definiert die __call__-Methode, die Objekte dieser Klasse "abrufbar" macht. Sowohl Funktionen als auch aufrufbare Objekte können aufgerufen werden, indem sie mit einer Argumentliste aufgerufen werden, und der Unterschied zwischen den beiden wirkt sich nicht auf die Erklärung aus. Doch hier ist ein Beispiel für eine einfache aufrufbar, die engen Parallelen Dense:

class Adder: 
    def __init__(self, a): 
     self.a = a 
    def __call__(self, b): 
     return self.a + b 

adder_of_three = Adder(3) 
adder_of_three(5) 
# => 8 

Adder(3)(5) 
# => 8 
+0

Dieses Beispiel kann irreführend sein, da [Dense] (https://github.com/fchollet/keras/blob/master/keras/layers/core.py#L607) in diesem Fall eine Klasse ist, die '__call__ definiert ', aber das Beispiel zeigt eine Factory-Funktion. – SethMMorton

+1

@SethMMorton: "Dichte" ist konzeptionell eine Funktion, die eine aufrufbare Funktion (als Konstruktor einer Klasse, die eine Methode "__call__" definiert) zurückgibt. 'make_adder' ist auch eine Funktion, die eine aufrufbare Funktion zurückgibt (durch Rückgabe einer Funktion, die definitionsgemäß aufrufbar ist). Sie sind nicht so verschieden. Technisch sicher - "Dichte" ist eine Klasse und "make_adder" eine Funktion - viele Unterschiede unter der Haube. Hmm, ich könnte das hinzufügen, obwohl ... – Amadan

+0

Ja, ich stimme zu, dass so eine Klasse unter der Haube gebaut wird. Aber für einen neuen Benutzer kann die Beschreibung verwirrend sein, denn wenn sie den Quellcode zu "dicht" betrachten, würden sie ihn als eine Klasse und nicht als eine Funktion definieren. Alles, was ich zu sagen versuche, ist, dass diese Antwort die Punkte zwischen einer Factory-Funktion und einer aufrufbaren Klasse nicht verbindet, sie könnte es verbessern, wenn die Verbindung hergestellt wird. Obwohl das OP bereits akzeptiert hat, ist es vielleicht nicht wert. – SethMMorton

Verwandte Themen