спасательная модель в пыльнике с уменьшением веса - PullRequest
0 голосов
/ 09 апреля 2020

это моя модель:

# basic LeNet5 network
class LeNet5_mode0 (nn.Module) : 

  # constructor 
  def __init__(self):
    super(LeNet5_mode0, self).__init__() # call to super constructor

    # define layers
    # 6 @ 28x28
    self.conv1 = nn.Sequential(
        # Lenet's first conv layer is 3x32x32, squeeze color channels into 1 and pad 2
        nn.Conv2d(in_channels = 1, out_channels = 6, kernel_size = 5, stride = 1, padding = 2),
        nn.ReLU(),
        nn.MaxPool2d(kernel_size = 2, stride = 2)
        )

    # 16 @ 10x10
    self.conv2 = nn.Sequential(
        nn.Conv2d(in_channels = 6, out_channels = 16, kernel_size = 5, stride = 1, padding = 0),
        nn.ReLU(),
        nn.MaxPool2d(kernel_size =2, stride = 2)
        )

    self.fc1 = nn.Sequential(
        nn.Linear(in_features = 16*5*5, out_features = 120),
        nn.ReLU()
        )

    self.fc2 = nn.Sequential(
        nn.Linear(in_features = 120, out_features = 84),
        nn.ReLU()
        )
    self.classifier = nn.Sequential(
        nn.Linear(in_features = 84,out_features = 10),
        nn.Softmax(dim = 1) # dim =1 meaning do softmax on the colums of 84x10
        )

  # define forward function
  def forward(self, x):
    x = self.conv1(x)
    x = self.conv2(x)
    x = x.view(-1, 16*5*5) # reshape the tensor to [-1,16*5*5]
    x = self.fc1(x)
    x = self.fc2(x)
    x = self.classifier(x)
    return x

, и я тренирую эту модель один раз с:

criterion = nn.CrossEntropyLoss() # aka, LogLoss
optimizer = torch.optim.Adam(model.parameters(), lr=0.0005)
scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=[5,10,15], gamma=0.5)

, а затем сохраняю с помощью

torch.save(model.state_dict(), savepath)

и загружаю с

model.load_state_dict(torch.load(loadpath))

пока проблем нет. но когда я немного меняю оптимизатор на

optimizer = torch.optim.Adam(model.parameters(), lr=0.0005, weight_decay = 0.0005)

и использую тот же метод сохранения и загрузки

, я получаю следующую ошибку:

in loading state_dict for LeNet5_mode0:
    Unexpected key(s) in state_dict: "conv1.1.weight", "conv1.1.bias", "conv1.1.running_mean", "conv1.1.running_var", "conv1.1.num_batches_tracked", "conv2.1.weight", "conv2.1.bias", "conv2.1.running_mean", "conv2.1.running_var", "conv2.1.num_batches_tracked".

как это можно быть исправленным? Почему разные оптимизаторы влияют на сохранение обученной сети?

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