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_channelself.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 操作需要多于一個數據計算平均值,因此造成該錯誤。
總結
以上是生活随笔為你收集整理的Expected more than 1 value per channel when training, got input size torch.Size([1, **])的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: @Mapper,@MapperScan与
- 下一篇: opencv for python (6