Expected more than 1 value per channel when training, got input size torch.Size([1, **])

目录

出现这种问题大概有两种情况

如果上面步骤三还没解决问题

原因分析


先定位下问题 

出现这种问题大概有两种情况

第一种情况是训练时候出现,另一种是测试模型的时候出现

 

出现这种问题一般是你输入的数据只有一张图片例如 [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 操作需要多于一个数据计算平均值,因此造成该错误。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值