PyTorch CNN никогда не сходится (проблема реализации подозревала) - PullRequest
0 голосов
/ 20 ноября 2019

У меня возникли проблемы с получением этой сети к работе по желанию. Я пробовал так много итераций этой модели, и все же не могу получить разумную ошибку (она никогда не подходит, даже не может ее переопределить).

Где я ошибся? Любая помощь будет принята с благодарностью

Для справки, есть 12 входных «изображений» (на самом деле это высота поверхности воды на 9 станциях в устье реки) формы 49,9 и 12 меток формы 1,9.

Полные примеры с данными можно найти по адресу https://gitlab.com/jb4earth/effonn/

  net = []
  class Net(torch.nn.Module):
      def __init__(self, kernel_size):
          super(Net, self).__init__()
          mid_size = (49*49*9)
          self.predict = torch.nn.Sequential(
              nn.Conv2d(
                          in_channels=1,
                          out_channels=mid_size,
                          kernel_size=kernel_size,
                          stride=1,
                          padding=(0, 0)
                      ),
              nn.ReLU(),
              nn.MaxPool2d(1),
              nn.ReLU(),
              nn.Conv2d(
                          in_channels=mid_size,
                          out_channels=1,
                          kernel_size=kernel_size,
                          stride=1,
                          padding=(0, 0)
                      ),
              nn.ReLU()
          )


      def forward(self, x):
          x = self.predict(x)
          return x

  def train_network(x,y,optimizer,loss_func):
      prediction = net(x)    
      loss = loss_func(prediction, y.squeeze())     
      optimizer.zero_grad()  
      loss.backward()     
      optimizer.step()    
      return prediction, loss


  net = Net((1,1))
  optimizer = torch.optim.Adam(net.parameters(), lr=0.01)
  loss_func = torch.nn.MSELoss()
  cnt = 0
  t = True
  while t == True:
      # get_xy in place of DataLoader
      (x,y) = get_xy(input_data,output_data,cnt)
      # x.shape is 1,1,49,9
      # y.shape is 1,1,1,9

      # train and predict
      (prediction,loss) = train_network(x,y,optimizer,loss_func)

      # prediction shape different than desired so averaging all results
      prediction_ = torch.mean(prediction)

      # only 12 IO's so loop through 
      cnt += 1
      if cnt > 11:
          cnt = 0

1 Ответ

1 голос
/ 21 ноября 2019

посмотрите сюда, это выглядит подозрительно. Вы вычисляете потери, а затем делаете нули градиентов. колл ноль град должен быть вызван до расчета потерь. Так что вам нужно переключить optimizer.zero_grad () к вершине, и я предполагаю, что это будет работать. Я не мог воспроизвести ваш пример, поэтому я предполагаю, что это ваша ошибка.

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