我在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)
Run Code Online (Sandbox Code Playgroud)
但是,我不知道函数调用形式的含义是什么:
x = Dense(64, activation='relu')(inputs)
Run Code Online (Sandbox Code Playgroud)
为什么在"密集"功能参数列表的括号外有"(输入)"?
因为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
Run Code Online (Sandbox Code Playgroud)
在这里,make_adder(3)返回定义为的函数
def the_adder(b)
return 3 + b
Run Code Online (Sandbox Code Playgroud)
然后用参数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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
680 次 |
| 最近记录: |