目录
先定位下问题
出现这种问题大概有两种情况
第一种情况是训练时候出现,另一种是测试模型的时候出现
出现这种问题一般是你输入的数据只有一张图片例如 [1,3,256,256]
步骤1 你试下改成 [2,3,256,256] 能否解决(如果无法加,请看下一个步骤),如果你是在训练模型,看步骤2 如果你是在测试模型,看步骤3
步骤2 如果你是在训练模型,在获取数据集时,将DataLoader中drop_last设置为True 把不够一个批次的数据丢弃。
步骤3 如果你是在测试模型,出现这种问题一般就是因为,你忘记加model.eval()
如果上面步骤三还没解决问题
一般是你模型定义出现问题
步骤4 如果使用了model.eval()还没有用,那么请你检查下你模型里面的定义,是不是把一些模块在forward方法里面定义,而不是都是在init方法里面定义
我的情况是这样子
错误代码
class _ASPP(nn.Module):
#剩下代码省略
def assp(x_s4,in_channel, out_channel,atrous_rates=[6, 12, 18]):
# ch = [64 * 2 ** p for p in range(6)]
# atrous_rates = [6, 12, 18]
# atrous_rates = [1, 2, 3]
#_ASPP 是一个Module的继承子类
_assp = _ASPP(in_channel, out_channel, atrous_rates)
return _assp(x_s4)
class TEST_MODEL(nn.Module):
def __init__(self, channel=32):
super(TEST_MODEL, self).__init__()
self.resnet = ResNet50()
def forward(self, x):
X = assp(X, X.shape[1], X.shape[1], atrous_rates=[3, 5, 7])
正确代码
def assp(x_s4,in_channel, out_channel,atrous_rates=[6, 12, 18]):
# ch = [64 * 2 ** p for p in range(6)]
# atrous_rates = [6, 12, 18]
# atrous_rates = [1, 2, 3]
return _assp(x_s4)
class TEST_MODEL(nn.Module):
def __init__(self, channel=32):
super(TEST_MODEL, self).__init__()
self.resnet = ResNet50()
# 在init中定义好你引用的模块
#定义好你的 in_channel out_channel
self.assp = _ASPP(in_channel, out_channel, atrous_rates=[3, 5, 7])
def forward(self, x):
X = self.assp(x)
原因分析
1、_ASPP 是一个Module的继承子类,如果要在一个模型里面用这个module,那么必须在Init里面定义,这样子你使用model.eval()才能够对你定义的模型起作用,否则是无效的
2、因为没有加 model.eval() 导致 BatchNorm没有关,而BatchNorm 操作需要多于一个数据计算平均值,因此造成该错误。