Почему разные стили кодирования дают разные результаты в Pytorch? - PullRequest
0 голосов
/ 17 июня 2020

Я новичок в Pytorch. Когда я реализую такую ​​сеть, в init ():

...        
self.conv1=nn.Conv2d(in_channel,out_channel_mid,kernel_size=1,stride=1,padding=0,bias=False)
        self.relu6=nn.ReLU6()
        self.bn1=nn.BatchNorm2d(out_channel_mid)
...

, затем в forward ():

            x=self.conv1(x)
            x=self.bn1(x)
            x=self.relu6(x)

я получаю такие результаты:

Batch:0 in Epoch:0,total loss:1.6094366312026978
Batch:30 in Epoch:0,total loss:49.83972668647766
Epoch:0, total loss: 0.025
Epoch:0, accuracy: 0.245
Batch:0 in Epoch:1,total loss:1.59962797164917
Batch:30 in Epoch:1,total loss:49.709712743759155
Epoch:1, total loss: 0.025
Epoch:1, accuracy: 0.245
Batch:0 in Epoch:2,total loss:1.6107732057571411
Batch:30 in Epoch:2,total loss:49.63734531402588
Epoch:2, total loss: 0.188
Epoch:2, accuracy: 0.217
Batch:0 in Epoch:3,total loss:49.33592987060547
Batch:30 in Epoch:3,total loss:474.46153497695923
Epoch:3, total loss: 0.188
Epoch:3, accuracy: 0.173
Batch:0 in Epoch:4,total loss:9.524840354919434
Batch:30 in Epoch:4,total loss:250.68861961364746
Epoch:4, total loss: 0.115
Epoch:4, accuracy: 0.217
...

модель окончательно сойдется, но очень медленно.

Но когда я кодирую таким образом, инкапсулирую базовые c модули свертки в класс:

class BasicBlock(nn.Module):
   def __init__(self,in_channel,out_channel,kernel_size=3,stride=1,padding=1,groups=1):
    super(BasicBlock,self).__init__()
   self.conv=nn.Sequential(nn.Conv2d(in_channel,out_channel,kernel_size,stride,padding,groups=groups,bias=False),                                                          nn.BatchNorm2d(out_channel),                                                           nn.ReLU6())
   def forward(self,x):
         x=self.conv(x)
         return x 

, затем определяю и вызываю его в соответствующей модели: self.conv1=BasicBlock(in_channel,out_channel_mid,kernel_size=1,stride=1,padding=0)

и модель сходится намного быстрее, чем раньше:

Batch:0 in Epoch:0,total loss:1.6127870082855225
Batch:30 in Epoch:0,total loss:72.60288417339325
Epoch:0, total loss: 0.031
Epoch:0, accuracy: 0.418
Batch:0 in Epoch:1,total loss:1.387904405593872
Batch:30 in Epoch:1,total loss:43.76062071323395
Epoch:1, total loss: 0.022
Epoch:1, accuracy: 0.533
Batch:0 in Epoch:2,total loss:1.3291308879852295
Batch:30 in Epoch:2,total loss:46.50250172615051
Epoch:2, total loss: 0.023
Epoch:2, accuracy: 0.481
Batch:0 in Epoch:3,total loss:1.2623569965362549
Batch:30 in Epoch:3,total loss:39.24768841266632
Epoch:3, total loss: 0.020
Epoch:3, accuracy: 0.514
Batch:0 in Epoch:4,total loss:1.6293309926986694
Batch:30 in Epoch:4,total loss:40.47891843318939
Epoch:4, total loss: 0.020
Epoch:4, accuracy: 0.538
Batch:0 in Epoch:5,total loss:1.3565115928649902
Batch:30 in Epoch:5,total loss:37.65265315771103
Epoch:5, total loss: 0.019
Epoch:5, accuracy: 0.574
Batch:0 in Epoch:6,total loss:1.2062609195709229
Batch:30 in Epoch:6,total loss:35.79732310771942

Я не могу понять разницу между этими двумя стилями.

Более того, использование пакетной нормализации, по-видимому, также замедляет сходимость модели, даже если она всегда обеспечивает одинаковую точность более чем за 10 эпох. Что-то не так, когда я использую эти методы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...