在调用像激活(' relu')(X)这样的课程时,它实际上是如何工作的?

时间:2018-05-14 19:21:00

标签: python keras

在我学习Keras的同时,我总是看到像Activation('relu')(X)这样的语法。我查看了源代码,发现Activation是一个类,所以对我来说Class(...)(...)之类的语法是如何工作的。

以下是example及其使用案例:A = Add()([A1, A2])

3 个答案:

答案 0 :(得分:3)

在Keras,它比vanilla Python更复杂。让我们分解一下当你致电Activation('relu')(X)时会发生什么:

  1. Activation('relu')通过调用类__init__ method来创建该类的新对象。这会以'relu'作为参数创建对象。
  2. Python中的所有对象都可以通过实现__call__来调用,允许您像函数一样调用它。 Activation('relu')(X)现在以X作为参数调用该函数。
  3. 但等等,Activation没有直接实现它,实际上它是被调用的基类Layer.__call__,它会进行一些检查,比如形状匹配等。
  4. 然后Layer.__call__实际calls self.call(X)然后调用Activation.call method,将激活应用于张量并返回结果。
  5. 希望澄清代码行,在创建其他层并使用功能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()