Keras中等号右侧仅以括号分隔的两个值代表什么含义?
语法本质
你看到的层类(初始化参数)(输入张量)的连续括号写法不是Keras框架自定义的特殊语法,是Python原生支持的可调用对象链式调用规则:
只要一个对象实现了__call__魔法方法,它就可以像普通函数一样,通过对象(参数)的形式被调用;如果前一次调用的返回值本身也是可调用对象,就可以直接在后面继续加括号传参调用,形成连续括号的写法。
具体执行逻辑
以你代码里的LSTM_layer = LSTM(units=256)(embedding)为例,整行代码会严格从左到右分两步执行:
- 先执行左侧的
LSTM(units=256):这一步是调用LSTM类的构造方法,传入units=256这类和层结构相关的超参数,创建一个初始化完成的LSTM层实例。这一步只完成层对象的创建,不会做任何张量运算,也不会关联输入。 - 再执行右侧的
(embedding):这一步是对第一步刚创建好的LSTM层实例做调用,把embedding作为输入张量传入层的__call__方法。Keras的所有层都在__call__方法里实现了权重创建、计算图连接、前向传播计算的逻辑,执行完成后会返回经过该层运算后的输出张量,最终把这个输出张量赋值给等号左侧的LSTM_layer变量。
你可以把连续括号的写法拆成两行,执行效果和原写法完全一致:
# 拆分后的等价代码 lstm_instance = LSTM(units=256) # 第一步:实例化层对象 LSTM_layer = lstm_instance(embedding) # 第二步:传入输入,拿到层输出
你给出的示例代码里其他层的写法逻辑完全相同:
Embedding(input_dim = len(tokenizer.word_index)+1, output_dim = 100)(sentence_input):先初始化Embedding层实例,再传入输入层sentence_input,得到词嵌入后的张量赋值给embeddingDense(1, activation='sigmoid')(LSTM_layer):先初始化二分类全连接层实例,再传入LSTM层的输出,得到最终的sigmoid概率输出张量
Keras采用这种写法的设计考量
- 代码简洁:搭建函数式模型时不需要为每一个层的中间实例额外命名,顺着数据流动的方向链式书写即可,代码结构和模型计算流完全对应,可读性更强
- 逻辑分离:层初始化时只需要传入层自身的结构超参数(比如单元数、激活函数),调用层时只需要传入输入张量,两类参数边界清晰,不会混淆。
内容的提问来源于stack exchange,提问作者Sherum
相关产品推荐
相关产品推荐

