При вызове класса, такого как Activation ('relu') (X), как он на самом деле работает? - PullRequest
0 голосов
/ 14 мая 2018

Пока я изучаю Keras, я всегда вижу синтаксис вроде Activation('relu')(X). Я посмотрел на исходный код и обнаружил, что Activation - это класс, поэтому мне не имеет смысла, как работает синтаксис, такой как Class(...)(...).

Вот пример и вариант его использования: A = Add()([A1, A2])

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

В Керасе это немного более замысловато, чем ванильный Питон. Давайте разберемся, что происходит, когда вы звоните Activation('relu')(X):

  1. Activation('relu') создает новый объект этого класса, вызывая класс __init__ метод . Это создает объект с 'relu' в качестве параметра.
  2. Все объекты в Python могут быть вызваны путем реализации __call__, позволяющей вам вызывать его как функцию. Activation('relu')(X) теперь вызывает эту функцию с X в качестве параметра.
  3. Но подождите, Activation напрямую не реализует его, фактически вызывается базовый класс Layer.__call__, который выполняет некоторые проверки, такие как сопоставление формы и т. Д.
  4. Затем Layer.__call__ фактически вызывает self.call(X), который затем вызывает Activation.call метод , который применяет активацию к тензору и возвращает результат.

Надеюсь, что проясняет эту строку кода, аналогичный процесс происходит при создании других слоев и вызове их с помощью функционального API.

0 голосов
/ 14 мая 2018

В 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 ....
0 голосов
/ 14 мая 2018

Ожидаете ли вы ключевое слово new? Python не использует это ключевое слово , вместо этого использует "обозначение функции":

В экземпляре класса используется функция обозначения. Просто притворись, что класс объект является функцией без параметров, которая возвращает новый экземпляр учебный класс. Например (при условии вышеупомянутого класса):

x = MyClass()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...