Проблема Решение
На самом деле ваш batch_size
проблематичен.Если вы установили его как единое целое, ваша target
нуждается в той же форме, что и выходные данные (которые вы правильно изменяете с помощью view(-1, 1)
).
Ваша потеря должна быть определена так:
loss = criterium(pred_y, target.view(-1, 1))
Эта сеть верна
Результаты
Ваши результаты не будут bias=5
(да, weight
действительно пойдет к 6
)поскольку вы добавляете случайный шум к target
(и поскольку это единственное значение для всех ваших точек данных, будет затронуто только bias
).
Если вы хотите, чтобы bias
равнялось 5
, удалитедобавление шума.
Вы также должны увеличить количество своих эпох, поскольку ваши данные довольно малы, а сеть (на самом деле линейная регрессия) не очень мощная. 10000
скажем, следуетвсе будет в порядке, и ваши потери должны колебаться в районе 0
(если вы измените шум на что-то заметное).
Шум
Вы создаете несколько гауссовых распределений с различными вариациями, поэтому ваша потеря будетвыше.Линейная регрессия не может вписаться в ваши данные и найти ощутимое смещение (поскольку оптимальный уклон для вашего шума все еще приблизительно равен 6
, вы можете попытаться увеличить умножение с 5
до 1000
и посмотреть, что weight
и bias
будут изучены).
Стиль (немного оффтоп)
Пожалуйста, прочитайте документацию по PyTorch и обновляйте свой код (например, Variable
устарела в пользу Tensor
ипо праву так).
Эта часть кода:
x_data = torch.from_numpy(x).float()
y_data = torch.from_numpy(y_noise).float()
if torch.cuda.is_available():
inputs = Tensor(x_data).cuda()
target = Tensor(y_data).cuda()
else:
inputs = Tensor(x_data)
target = Tensor(y_data)
Можно написать кратко, как это (без долгих размышлений):
inputs = torch.from_numpy(x).float()
target = torch.from_numpy(y_noise).float()
if torch.cuda.is_available():
inputs = inputs.cuda()
target = target.cuda()
Я знаю, что глубокое обучение имеет репутацию плохогокод и фатальная практика, но пожалуйста не помогут распространить этот подход.