Полностью подключенная нейронная сеть неправильно предсказывает

#python #machine-learning #deep-learning #neural-network #pytorch

Вопрос:

Я новичок в ML и DL, но я решил кое-что попробовать, но обнаружил, что моя сеть неправильно предсказывает.

У меня есть полностью подключенная нейронная сеть всего с одним плотным (линейным) слоем, и я использовал SGD в качестве оптимизатора, и он предсказал 9,9 вместо 10, но когда я использую Adam, он предсказал 10. ожидаемый результат 10, я в замешательстве, может кто-нибудь объяснить мне, почему это так?

 !pip install -Uqq tqdm

import torch
import torch.nn as nn
import torch.optim as optim
from tqdm import tqdm as tqdm
 

Мои тренировочные данные в качестве образца

 X = torch.tensor([[1], [2], [3], [4]], dtype=torch.float32)
Y = torch.tensor([[2], [4], [6], [8]], dtype=torch.float32)
 

Моя модель или сеть для прямого прохода и нейронной сети

 class SimpleNeuralNetwork(nn.Module) :
  def __init__(self, num_input, num_output):
    super(SimpleNeuralNetwork, self).__init__()
    self.fc = nn.Linear(num_input, num_output)

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

В функциях и пакетах

   in_samples, in_features = X.shape
 

Определение и инициализация моей функции потерь

 criterion = nn.MSELoss()
 

Параметры тренировочного процесса

 learning_rate = 0.01
ePoch = 1000
 

Инициализация моей модели

 sNN = SimpleNeuralNetwork(in_features, in_features)
 

Инициализация моего оптимизатора

 optimiser = optim.SGD(sNN.parameters(), lr=learning_rate)
 

Тренировка моей сети

 for i in tqdm(list(range(ePoch))):
  # prediction - forward pass in the model
  y_pred = sNN(X)

  # loss - check how well or how far our model did with the prediction
  loss = criterion(Y, y_pred)

  # gradient - do a backward propagation (backward pass)
  loss.backward()

  # update weight - readjust the weight using our learning rate as a proximity
  optimiser.step()

  # zero gradient - reinitialize our memory to zero so that the neural network will not cram
  optimiser.zero_grad()

  # if i % 10 == 0:
    #   [w, b] = sNN.parameters()
    #   print(f'epoch: {i   1}, weight: {w[0][0].item()}, bias: {b[0].item()}, pred: {y_pred}')
 

Фактическое предсказание

 predict = sNN(torch.tensor([5], dtype=torch.float32))
print(f'prediction for 5: {predict[0].item()}')
 

Комментарии:

1. Это часть оптимизации, но 9,9 можно округлить до 10, так что я не вижу здесь проблемы. Вы не можете ожидать, что оптимизация ADAM будет равна SGD, они могут быть близки, но дадут некоторые другие результаты.

2. @David верен ли приведенный выше код? Я все еще не понимаю структуру или форму тензора линейного слоя, и CNN всегда ожидает, что параметры сбивают с толку.

3. Да, в целом все выглядит нормально. возможно, было бы слишком сложно обучить сеть умножению на 2. но это только начало

4. @Дэвид, пожалуйста, простите мое любопытство, как сеть, в свою очередь, знает, что нужно выполнить умножение матрицы на два. Может быть, ты мог бы быть моим наставником по DL. Мне любопытно узнать это и реализовать самоуправляемый автомобиль или любой объект, который может распознавать и выполнять множество трюков