Величина убытка в линейной регрессии - PullRequest
0 голосов
/ 05 августа 2020

Я решил задачу линейной регрессии с набором данных Boston и получил следующие результаты:

Значение потерь не изменяется с увеличением числа значений. В чем причина этой ошибки? Пожалуйста, помогите

import pandas as pd
import torch
import numpy as np
import torch.nn as nn
from sklearn import preprocessing
training_set=pd.read_csv('boston_data.csv')
training_set=training_set.to_numpy()
test_set=test_set.to_numpy()
inputs=training_set[:,0:13]
inputs=preprocessing.normalize(inputs)
target=training_set[:,13:14]
target=preprocessing.normalize(target)
inputs=torch.from_numpy(inputs)
target=torch.from_numpy(target)
test_set=torch.from_numpy(test_set)
w=torch.randn(13,1,requires_grad=True)
b=torch.randn(404,1,requires_grad=True)
def model(x):
    return x@w+b
pred=model(inputs.float())
def loss_MSE(x,y):
    ras=x-y
    return torch.sum(ras * ras) / ras.numel()
for i in range(100):
    pred=model(inputs.float())
    loss=loss_MSE(target,pred)
    loss.backward()
    with torch.no_grad():
        w -= w.grad * 1e-5
        b -= b.grad * 1e-5
        w.grad.zero_()
        b.grad.zero_()
    print(loss) 

1 Ответ

0 голосов
/ 06 августа 2020

добро пожаловать в Stackoverflow

Ваш основной l oop в порядке (вы могли бы значительно облегчить себе жизнь, вы, вероятно, должны прочитать this ), но ваша скорость обучения (1e -5), скорее всего, слишком мало .

Я попытался решить небольшую фиктивную задачу, она была решена очень быстро со скоростью обучения ~ 1e-2, и потребовалось бы намного больше времени с 1e-5. Тем не менее, он все равно сходится, но спустя более 100 эпох. Вы упомянули, что пытались увеличить количество эпох, но не написали, сколько эпох вы на самом деле проводили. Попробуйте увеличить этот параметр (скорость обучения), чтобы увидеть, решит ли он вашу проблему. Вы также можете попробовать удалить деление на numel(), что будет иметь тот же эффект (деление также применяется к градиентам).

В следующий раз, пожалуйста, предоставьте небольшой минимальный пример чем можно запустить и воспроизвести вашу ошибку. Здесь большая часть вашего кода - это загрузка данных, которую можно заменить двумя строками генерации фиктивных данных.

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