CIFAR10數據集實戰-ResNet網路構建(下)

  • 2020 年 2 月 24 日
  • 筆記

試運行一下:

發現報錯

RuntimeError: Given groups=1, weight of size 128 64 3 3, expected input[2, 3, 32, 32] to have 64 channels, but got 3 channels instead

報錯原因為維度輸入錯誤。進行更改

tmp = torch.randn(2, 64, 32, 32)

再次運行

輸出為

torch.Size([2, 128, 32, 32])

這裡注意到由[2, 64, 32, 32]到[2, 128, 32, 32],channel數量翻倍,而長和寬沒有變化。這樣勢必會導致x的維度會越來越大。

因此為實現讓長和寬能進行減小後,再運算。我們在卷積層中加入了stride設置。

程式碼改為

blk = ResBlk(64, 128, stride=2)

同樣在定義時加上stride

def __init__(self, ch_in, ch_out, stride=1):

然後在卷積層中設置

self.conv1 = nn.Conv2d(ch_in, ch_out, kernel_size=3, stride=stride, padding=1)

另外

Short cut中的stride也要與第一層卷積層保持一致

改程式碼為

if ch_out != ch_in:      self.extra = nn.Sequential(          nn.Conv2d(ch_in, ch_out, kernel_size=1, stride=stride),

這時運行的輸出為

torch.Size([2, 128, 16, 16])

這時為檢測整個數據是否match,我們對x進行定義

x = torch.randn(2, 3, 32, 32)  model = ResNet()  out = model(x)  print('resnet:', out.shape)

運行後報錯:

RuntimeError: size mismatch, m1: [65536 x 32], m2: [1024 x 10] at ..atensrcTH/generic/THTensorMath.cpp:961

由報錯結果上看,out.layer上出現錯誤

在out.layer上添加程式碼

print('after conv:', x.shape)  x = self.outlayer(x)

該段輸出

after conv: torch.Size([2, 1024, 32, 32])

首先為減小數據量 我們在4個ResNet單元層添加stride

self.blk1 = ResBlk(64, 128, stride=2)

另外我悶在輸出層前加入pooling層

x = F.adaptive_avg_pool2d(x, [1, 1])  print('after pool:', x.shape)  x = x.view(x.size(0), -1)

此時輸出為

after conv: torch.Size([2, 1024, 2, 2])  after pool: torch.Size([2, 1024, 1, 1])  resnet: torch.Size([2, 10])

最後輸出為10個,對應於十分類問題。

將沒用的輸出資訊注釋掉,繼續完善程式碼

回到main.py文件中去

引入工具包處改為

# from LeNet5 import LeNet5  from resnet import ResNet

並將

model = LeNet5().to(device)

改為

model = ResNet().to(device)

其餘地方不需要改

運行main.py文件

結果顯示為

acc: 0.6112  acc: 0.7071  acc: 0.7558  acc: 0.7831  acc: 0.7832  acc: 0.795  acc: 0.7958  acc: 0.7879  acc: 0.7995

正確率隨著epoch的運行持續增加

至此,ResNet和LeNet5都已介紹完畢。

Tags: