将两个Sequential模型合并为一个与直接使用单个Sequential模型有何区别
两种Sequential模型实现的差异说明
你给出的两种实现分别是单架构Sequential模型、两个子Sequential合并的模型,对应代码如下:
# 单个架构完全相同的Sequential模型 model = tf.keras.models.Sequential([ tf.keras.layers.Dense(2,input_shape = [3]), tf.keras.layers.Dense(3) ]) # 两个子Sequential合并的模型 encoder = tf.keras.models.Sequential([tf.keras.layers.Dense(2,input_shape = [3])]) decoder = tf.keras.models.Sequential([tf.keras.layers.Dense(3,input_shape = [2])]) autoencoder = tf.keras.models.Sequential([encoder,decoder])
二者的前向传播计算逻辑、可训练参数数量完全一致,核心差异集中在使用灵活性和内部结构上:
- 子模块独立调用能力
拆分得到的encoder和decoder支持单独调用,训练完成后可以直接用encoder.predict(x)提取输入的潜在特征,用decoder.predict(z)完成特征到原始空间的重建。如果是单个Sequential模型,想要获取中间层输出需要额外定义截断模型,操作复杂度更高。 - 参数调整灵活性更高
可以单独对encoder或decoder做参数冻结、学习率设置,比如做迁移学习时只需要训练decoder,直接设置encoder.trainable = False即可,不需要遍历单个Sequential的层逐个修改trainable属性。 - 内部层结构不同
单个Sequential的model.layers属性会直接返回两个Dense层对象;合并得到的autoencoder的autoencoder.layers返回的是[encoder模型, decoder模型]两个子模型对象,要获取底层的Dense层需要额外遍历子模型的layers属性。 - 形状校验时机不同
合并两个子Sequential时,Keras会立刻校验前一个子模型的输出形状和后一个子模型的输入形状是否匹配,不匹配会直接抛出错误;单个Sequential的形状校验会延迟到首次调用、训练的时候才触发。 - 模型复用性更强
拆分的子模型支持单独保存、加载,比如做特征检索场景下只需要保存encoder即可,不需要存储整个autoencoder的权重和结构,节省资源开销。
内容的提问来源于stack exchange,提问作者Prikshit Singla
相关产品推荐
相关产品推荐

