SegNet运行遇custom_layers缺失及MaxUnpooling2D维度不匹配报错求助
问题解决方法
错误1:ModuleNotFoundError: No module named 'custom_layers' 解决
- 方案1:直接把
MaxPoolingWithArgmax2D和MaxUnpooling2D两个自定义层的代码复制到训练主脚本的开头,不需要单独存放在custom_layers目录,即可直接调用,无需额外导入。 - 方案2:保留目录结构的话按以下操作:
- 在
C:\spyder\codes\custom_layers目录下新建空文件__init__.py - 在主脚本开头添加代码:
import sys sys.path.append("C:/spyder/codes") from custom_layers.layers import MaxPoolingWithArgmax2D, MaxUnpooling2D - 在
错误2:InvalidArgumentError 维度不匹配解决
报错根本原因是解码器卷积层输出通道数和对应mask的通道数不匹配,导致scatter_nd的indices和updates元素总数差1倍,和你报错的数值完全吻合,按以下步骤修改即可:
- 修正解码器各层通道数,和对应mask的通道数对齐:
conv_5的卷积核数从8*num_filters改为4*num_filters,匹配mask3的256通道conv_6的卷积核数从4*num_filters改为2*num_filters,匹配mask2的128通道conv_7的卷积核数从2*num_filters改为1*num_filters,匹配mask1的64通道
- 修正
MaxUnpooling2D层的动态形状计算逻辑,避免静态形状导致的隐式错误,替换call方法中的reshape部分代码:# 删掉原来用静态形状updates.shape计算的逻辑 out_shape = [ input_shape[0], input_shape[1] * self.size[0], input_shape[2] * self.size[1], input_shape[3] ] - 删掉输出部分重复的3次卷积+激活逻辑,只保留1次输出层即可;你之前定义的归一化Lambda层没有被使用,要么删掉要么把conv1的输入改为归一化后的张量。
- 可选优化:
MaxPoolingWithArgmax2D中返回的argmax不需要转成float,直接返回int类型即可,避免来回类型转换的精度损失。
修改完成后重新运行代码即可解决所有报错。
内容的提问来源于stack exchange,提问作者Nagaraj Rajendiran
相关产品推荐
相关产品推荐

