Keras Sequential模型转Functional API方法,含ABS层插入实现
Keras Sequential转Functional API实现(含ABS层插入说明)
转换核心思路
Sequential模型本质是单路线性堆叠的结构,转Functional的时候不需要改动原有的计算逻辑流,只需要把原来Sequential内部隐式的张量传递过程拆成显式的变量传递链路:
- 显式定义独立的输入张量,替代原来写在第一层上的
input_shape参数 - 每一层的输入都接收上一步的输出张量,和原Sequential的层顺序完全对齐
- 最后把输入张量、最终输出张量传入
Model类完成模型实例化
ABS取绝对值层的插入逻辑
取绝对值的功能在Functional架构里没有特殊适配要求,严格对照原Sequential的层顺序插在对应节点即可:
原Sequential的计算链路为:输入 → 16通道5x5卷积 → 逐元素取绝对值 → tanh激活
对应Functional里的串接位置,就是把取绝对值的操作接在卷积层输出、tanh激活层之间,和原计算流1:1对齐。
完整实现代码
from tensorflow.keras import Model, Input, Conv2D, Lambda, Activation import tensorflow as tf # 显式定义输入层 inputs = Input(shape=(256, 256, 1)) # 串接卷积层:因为已经有独立的Input层,这里不需要再传input_shape conv_feat = Conv2D(16, (5,5))(inputs) # 插入取绝对值的ABS节点,两种等价实现任选: # 方式1:和原代码一致,用Lambda层封装tf.abs abs_feat = Lambda(lambda x: tf.abs(x))(conv_feat) # 方式2:直接对张量做绝对值运算,无需额外封装层,效果完全等价 # abs_feat = tf.abs(conv_feat) # 串接激活层 output_feat = Activation('tanh')(abs_feat) # 实例化模型 model = Model(inputs=inputs, outputs=output_feat)
容易踩的坑
- 不需要保留原Sequential里
model.layers[0].output的写法:Functional是显式持有每一步的输出张量,直接把上一步的变量传给下一层即可,不需要通过层索引调取中间结果。 - 不要打乱层的计算顺序:取绝对值的操作必须在卷积之后、tanh激活之前执行,否则最终输出和原Sequential模型的结果会不一致。
- 取绝对值的操作既可以封装成Lambda层,也可以直接对张量做逐元素运算,两种写法在Functional里都是合法的,计算结果没有区别。
内容的提问来源于stack exchange,提问作者Saeed Hassiny
相关产品推荐
相关产品推荐

