Я новичок в 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 эпох. Что-то не так, когда я использую эти методы?