Keras构建模型输入时Sequential与Concatenate的差异解析
Keras两种输入构建方式的差异对比
在Keras中构建模型输入时,你提到的两种方式分别对应Sequential顺序模型和函数式API(结合Concatenate层),二者核心差异体现在灵活性、适用场景和扩展性上,具体对比如下:
方式一:Sequential顺序模型
这种方式适用于单输入、线性堆叠的简单模型:
model = tf.keras.models.Sequential() model.add(tf.keras.layers.Dense(units=1, input_shape=(2,), kernel_regularizer='l1', activation=tf.sigmoid)) model.compile(optimizer=tf.keras.optimizers.experimental.RMSprop(learning_rate=my_learning_rate), loss=tf.keras.losses.BinaryCrossentropy(), metrics=METRICS)
方式二:函数式API(结合Concatenate层)
这种方式用于多输入或复杂拓扑的模型,通过显式定义输入层并拼接实现:
my_inputs = { # 用于训练模型的特征 'median_income': tf.keras.Input(shape=(1,)), 'total_rooms': tf.keras.Input(shape=(1,)) } # 使用Concatenate层将输入层拼接为单个张量,作为Dense层的输入。示例:[input_1[0][0], input_2[0][0]] concatenated_inputs = tf.keras.layers.Concatenate()(my_inputs.values()) dense = tf.keras.layers.Dense(units=1, name='dense_layer', activation=tf.sigmoid) dense_output = dense(concatenated_inputs) """创建并编译一个简单的分类模型。""" my_outputs = { 'dense': dense_output, } model = tf.keras.Model(inputs=my_inputs, outputs=my_outputs) # 调用compile方法将层构建为TensorFlow可执行的模型。注意分类与回归使用的损失函数不同。 model.compile(optimizer=tf.keras.optimizers.experimental.RMSprop(learning_rate=my_learning_rate), loss=tf.keras.losses.BinaryCrossentropy(), metrics=METRICS)
核心差异点
输入结构灵活性
- Sequential仅支持单一输入张量,所有特征必须预先打包成一个固定形状的张量(比如示例中(2,)的形状对应两个特征),无法处理独立的多输入源。
- 函数式API支持多输入层,每个特征可以单独定义输入层,适合特征来自不同数据源、需要单独做预处理(比如归一化、嵌入)的场景。
数据传递方式
- Sequential训练时需传入与
input_shape匹配的单一张量,每个样本是包含所有特征的数组(如[median_income, total_rooms])。 - 函数式API可以直接传入字典格式的输入,键对应输入层的名称,值对应各自的特征数据,特征映射更直观,尤其在特征数量较多时更易维护。
- Sequential训练时需传入与
模型扩展性
- Sequential是严格的线性层堆叠,只能按顺序添加层,无法实现分支、多输出、共享层等复杂拓扑结构。
- 函数式API可以自由构建任意模型拓扑,比如可以给不同输入层单独添加预处理层后再拼接,后续还能扩展多输出分支,适配复杂任务需求。
代码简洁性与可读性
- 对于单输入的简单模型,Sequential代码更简洁,行数少,易上手。
- 对于多输入或复杂模型,函数式API的代码结构更清晰,每个输入、处理步骤都显式定义,后期修改和调试更方便。
内容的提问来源于stack exchange,提问作者Nitul
相关产品推荐
相关产品推荐

