在我学习Keras的同时,我总是看到像Activation('relu')(X)
这样的语法。我查看了源代码,发现Activation
是一个类,所以对我来说Class(...)(...)
之类的语法是如何工作的。
以下是example及其使用案例:A = Add()([A1, A2])
答案 0 :(得分:3)
在Keras,它比vanilla Python更复杂。让我们分解一下当你致电Activation('relu')(X)
时会发生什么:
Activation('relu')
通过调用类__init__
method来创建该类的新对象。这会以'relu'作为参数创建对象。__call__
来调用,允许您像函数一样调用它。 Activation('relu')(X)
现在以X
作为参数调用该函数。Activation
没有直接实现它,实际上它是被调用的基类Layer.__call__
,它会进行一些检查,比如形状匹配等。Layer.__call__
实际calls self.call(X)
然后调用Activation.call
method,将激活应用于张量并返回结果。希望澄清代码行,在创建其他层并使用功能API调用它们时会发生类似的过程。
答案 1 :(得分:1)
在python中,类可能有__call__
方法,这意味着类实例是可调用的。
所以,拨打Activation(...)(...)
是完全可以的。
第一步创建Activation
的实例,第二步使用一些参数调用该实例。
与完成相同:
activationLayer = Activation('relu')
outputTensor = activationLayer(inputTensor) #where inputTensor == X in your example
通过这种方式,您还可以重复使用具有不同输入张量的相同图层:
activationLayer = Activation('relu')
out1 = activationLayer(X1)
out2 = activationLayer(X2)
这与标准激活层没有太大区别,但是对于某些经过训练的图层,它开始变得非常有趣。
示例:您希望使用经过标准训练的VGG16模型处理两个图像,然后加入图像:
vgg16 = keras.applications.vgg16(......)
img1 = Input(imageShape1)
img2 = Input(imageShape2)
out1 = vgg16(img1) #a model is also a layer by inheritance
out2 = vgg16(img2)
... continue the model ....
答案 2 :(得分:-1)
您是否期望new
关键字? Python does not use that keyword使用“函数表示法”:
类实例化使用函数表示法。只是假装上课 object是一个无参数函数,它返回一个新的实例 类。例如(假设上述类):
x = MyClass()