Проблема линейной регрессии PyTorch - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь реализовать простую линейную модель в PyTorch, которой можно дать x данных и y данных, а затем обучить распознавать уравнение y = mx + b. Однако всякий раз, когда я пытаюсь проверить свою модель после тренировки, она думает, что уравнение имеет вид y = mx + 2b. Я покажу свой код, и, надеюсь, кто-то сможет обнаружить проблему. Заранее благодарю за любую помощь.

import torch

D_in = 500
D_out = 500
batch=200
model=torch.nn.Sequential(
     torch.nn.Linear(D_in,D_out),
)

Далее я создаю некоторые данные и устанавливаю правило. Давай сделаем 3х + 4.

x_data=torch.rand(batch,D_in)
y_data=torch.randn(batch,D_out)

for i in range(batch):
    for j in range(D_in):
         y_data[i][j]=3*x_data[i][j]+5 # model thinks y=mx+c -> y=mx+2c?

loss_fn=torch.nn.MSELoss(size_average=False)
optimizer=torch.optim.Adam(model.parameters(),lr=0.001)

Теперь к тренировкам ...

for epoch in range(500):
    y_pred=model(x_data)
    loss=loss_fn(y_pred,y_data)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

Затем я тестирую свою модель с тензором / матрицей всего 1.

test_data=torch.ones(batch,D_in) 
y_pred=model(test_data)

Теперь я ожидаю получить 3 * 1 + 4 = 7, но вместо этого моя модель думает, что это 11.

[[ 10.7286,  11.0499,  10.9448,  ...,  11.0812,  10.9387,
      10.7516],
    [ 10.7286,  11.0499,  10.9448,  ...,  11.0812,  10.9387,
      10.7516],
    [ 10.7286,  11.0499,  10.9448,  ...,  11.0812,  10.9387,
      10.7516],
    ...,
    [ 10.7286,  11.0499,  10.9448,  ...,  11.0812,  10.9387,
      10.7516],
    [ 10.7286,  11.0499,  10.9448,  ...,  11.0812,  10.9387,
      10.7516],
    [ 10.7286,  11.0499,  10.9448,  ...,  11.0812,  10.9387,
      10.7516]])

Точно так же, если я изменю правило на y = 3x + 8, моя модель угадает 19. Итак, я не уверен, что происходит. Почему константа добавляется дважды? Кстати, если я просто установлю правило на y = 3x, моя модель правильно выведет 3, а для y = mx в целом моя модель правильно выведет m. По какой-то причине постоянный термин отбрасывает его. Любая помощь для решения этой проблемы высоко ценится. Спасибо!

1 Ответ

0 голосов
/ 05 июля 2018

Ваша сеть не учится достаточно долго. Он получает вектор с 500 объектами для описания одного элемента данных.

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

Если я уменьшу размерность ввода и вывода и увеличу размер пакета, скорость обучения и этапы обучения, я получу ожидаемый результат:

import torch

D_in = 100
D_out = 100
batch = 512

model=torch.nn.Sequential(
     torch.nn.Linear(D_in,D_out),
)

x_data=torch.rand(batch,D_in)
y_data=torch.randn(batch,D_out)
for i in range(batch):
    for j in range(D_in):
         y_data[i][j]=3*x_data[i][j]+4 # model thinks y=mx+c -> y=mx+2c?

loss_fn=torch.nn.MSELoss(size_average=False)
optimizer=torch.optim.Adam(model.parameters(),lr=0.01)

for epoch in range(10000):
    y_pred=model(x_data)
    loss=loss_fn(y_pred,y_data)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

test_data=torch.ones(batch,D_in)
y_pred=model(test_data)
print(y_pred)

Если вы просто хотите приблизить f(x) = 3x + 4 только с одним входом, вы также можете установить D_in и D_out в 1.

...