我在Keras看到了一个Python函数调用方式'像这样的教程:
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)
但是,我不知道函数调用形式的含义是什么:
x = Dense(64, activation='relu')(inputs)
为什么会出现"(输入)"在函数" Dense"的参数列表的括号之外?
答案 0 :(得分:6)
因为Dense(...)
返回一个可调用的(基本上是一个函数),所以可以依次调用它。这是一个简单的例子:
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
此处,make_adder(3)
返回定义为
def the_adder(b)
return 3 + b
然后使用参数5
调用该函数将返回8
。如果您跳过将make_adder(3)
的返回值分配给单独变量的步骤,则会收到您询问的表单:make_adder(3)(5)
与您的问题中的Dense(64, activation='relu')(inputs)
相同。
编辑:从技术上讲,Dense
在Python中不被归类为函数,而是作为一个类;因此Dense(...)
是对构造函数的调用。有问题的类定义了__call__
方法,该方法使该类的对象“可调用”。可以通过使用参数列表调用函数和可调用对象来调用它们,并且两者之间的差异根本不会影响解释。但是,这是一个简单的可调用的示例,它更接近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