图像分割U-Net模型解码路径代码实现规则咨询
U-Net解码路径规则解释与代码校验
三条规则具体含义
- 规则1:将前一个块的输出作为expansive_input,对应编码阶段的块输出作为contractive_input
U-Net的解码路径核心是上采样+跳跃连接的对称结构:expansive_input是上一步解码块输出的、已经完成上采样的特征图,contractive_input是编码阶段和当前解码层尺度完全对应的特征图,二者拼接后再做卷积,可以弥补上采样过程中丢失的底层细节信息。 - 规则2:必须使用编码块输出的第二个元素,即最大池化操作之前的特征层
你代码中的conv_block返回两个值:第一个是经过最大池化的下采样特征,用来传给下一层编码块做输入;第二个是未经过池化的原始卷积输出特征,尺寸和对应解码层上采样后的尺寸一致,是跳跃连接需要用到的特征,所以必须取编码块输出的第二个值。 - 规则3:每一步使用的滤波器数量为前一个块的一半
编码路径的滤波器数量是每经过一个块就翻倍,解码路径和编码路径完全对称,每经过一个上采样块滤波器数量就减半,保证解码层上采样后的特征和对应编码层待拼接的特征通道数一致,不会出现拼接维度不匹配的问题。
现有代码问题说明
你当前编写的解码路径代码仅ublock6符合要求,ublock7到ublock9的contractive_input取值全部错误,没有对应到编码阶段的同尺度特征:
- ublock7的contractive_input应该取
cblock3[1],你当前用的cblock5[0]是编码最底层的下采样特征,尺寸完全不匹配 - ublock8的contractive_input应该取
cblock2[1],你当前用的ublock6[0]是上一层解码的输出,不是编码阶段的特征 - ublock9的contractive_input应该取
cblock1[1],你当前用的ublock7[0]同样是解码层输出,不符合要求
另外你最后的输出层conv10也存在错误,滤波器数量应该设为n_classes,否则输出的通道数和类别数不匹配。
修正后的代码参考
# 修正后的解码路径代码 ublock6 = upsampling_block(cblock5[0], cblock4[1], n_filters*8) ublock7 = upsampling_block(ublock6, cblock3[1], n_filters*4) ublock8 = upsampling_block(ublock7, cblock2[1], n_filters*2) ublock9 = upsampling_block(ublock8, cblock1[1], n_filters) conv9 = Conv2D(n_filters, 3, activation='relu', padding='same', kernel_initializer='he_normal')(ublock9) # 修正输出层 conv10 = Conv2D(n_classes, 1 , padding='same')(conv9)
注:如果upsampling_block的返回值是单个特征张量而非元组,不需要在ublock6等变量后加[0]取值。
内容的提问来源于stack exchange,提问作者bharadwaj
相关产品推荐
相关产品推荐

