迁移学习添加新层遇ValueError:合并层需传入输入列表
迁移学习模型构建错误修复
错误原因分析
报错源于代码中add()方法的两处错误使用:
- 传入对象类型错误:手动调用
Dense层并传入cloned_model.layers[0]作为输入,将张量结果传给add(),但Sequential.add()仅接受Layer对象,不支持直接传入张量。 - 错误赋值
add()结果:Sequential.add()是原地修改模型的方法,无返回值,不能将其赋值给新变量model2。
修正后的代码
def transfered_model_prep(new_model): # 冻结原模型参数 new_model.trainable = False # 克隆模型并复制原权重 cloned_model = keras.models.clone_model(new_model) cloned_model.set_weights(new_model.get_weights()) cloned_model.trainable = False # 构建移除最后一层的Sequential模型 cloned_model1 = keras.models.Sequential(cloned_model.layers[:-1]) # 正确添加新的二分类输出层 cloned_model1.add(keras.layers.Dense(1, activation='sigmoid')) # 编译模型 cloned_model1.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"]) return cloned_model1
额外注意事项
如果原模型移除最后一层后的输出是多维张量(比如卷积层输出的特征图),需要先添加Flatten()层将其转为一维向量,再连接Dense层:
cloned_model1.add(keras.layers.Flatten()) cloned_model1.add(keras.layers.Dense(1, activation='sigmoid'))
内容的提问来源于stack exchange,提问作者Baraa najjar
相关产品推荐
相关产品推荐

