#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. Мне любопытно узнать это и реализовать самоуправляемый автомобиль или любой объект, который может распознавать и выполнять множество трюков