Я пытаюсь реализовать простую линейную модель в 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. По какой-то причине постоянный термин отбрасывает его. Любая помощь для решения этой проблемы высоко ценится. Спасибо!