2016-11-08 2 views
0

Я видел функцию Python, призывающую путь в учебнике 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) 

Почему существует «(входы)» за пределами скобки функции «Плотный» список параметров?

+1

Возможный дубликат [Что такое «Карринг»] (http://stackoverflow.com/questions/36314/what-is- currying) –

ответ

5

Потому что 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) с вашего вопроса.

EDIT: Технически 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 
+0

Этот пример может вводить в заблуждение, поскольку в этом случае [Dense] (https://github.com/fchollet/keras/blob/master/keras/layers/core.py#L607) является классом, который определяет '__call__ ', но пример показывает заводскую функцию. – SethMMorton

+1

@SethMMorton: концептуально «Dense» - это функция, которая возвращает вызываемый (как конструктор класса, определяющий метод '__call__'). 'make_adder' также является функцией, которая возвращает вызываемый (путем возврата функции, которая по определению является вызываемой). Они не такие разные. Технически, конечно - 'Dense' - это класс, а' make_adder' - функция - множество различий под капотом. Хм, я мог бы добавить это, хотя ... – Amadan

+0

Да, я согласен, что так устроен класс под капотом. Но для нового пользователя описание может ввести в заблуждение, потому что если бы они посмотрели исходный код на «Плотный», они увидели бы его как класс, а не функцию. Все, что я пытаюсь сказать, заключается в том, что этот ответ не связывает точки между заводской функцией и вызываемым классом, это может улучшить ее, если соединение было сделано. Хотя OP уже принял так, возможно, это не стоит. – SethMMorton

Смежные вопросы