TensorFlow U-Net模型添加Dropout报错AttributeError,求解决
解决U-Net模型添加Dropout时的AttributeError问题
错误原因
你遇到的AttributeError: 'Functional' object has no attribute 'add',是因为Segmentation Models库返回的Unet属于Keras Functional模型,这类模型不支持add()方法——add()是Sequential(顺序型)模型独有的API,仅适用于按顺序堆叠的简单网络结构。而Unet包含跳跃连接的多分支复杂结构,本身就是用Functional API构建的,所以无法直接调用add或用Sequential包裹。
正确修改方案
要给Functional模型新增层,需要基于原模型的输入、输出张量,重新构建新模型:
from tensorflow.keras.layers import Dropout from tensorflow.keras.models import Model # 补充BACKBONE的具体取值(示例为resnet34,可根据你的需求修改) BACKBONE = 'resnet34' # 初始化原Unet模型 model = sm.Unet(BACKBONE, encoder_weights='imagenet', encoder_freeze=True) # 获取原模型的输入、输出张量 input_tensor = model.input x = model.output # 在原模型输出后添加Dropout层 x = Dropout(0.2)(x) # 用新的输入、输出张量构建Functional模型 new_model = Model(inputs=input_tensor, outputs=x) # 编译新模型并设置训练参数 new_model.compile(optimizer='Adam', loss=dice_loss, metrics=[f1, sm.metrics.iou_score, 'accuracy']) new_model.trainable = True print(new_model.summary())
关键说明
- Functional模型的核心是张量流,必须通过输入、输出张量的连接来扩展结构,而非调用
add方法。 - 不要尝试用
Sequential()包裹Unet,因为Unet的跳跃连接结构无法被顺序型模型的线性堆叠逻辑表达,会直接破坏原模型的结构。
内容的提问来源于stack exchange,提问作者Allana Pracuccio Freitas
相关产品推荐
相关产品推荐

