Для этой проблемы может быть намного проще, если вы рассматриваете Net()
со слоем 1 Linear
как Linear Regression
с входными функциями, включающими [x^2, x]
.
Генерация данных
import torch
from torch import Tensor
from torch.nn import Linear, MSELoss, functional as F
from torch.optim import SGD, Adam, RMSprop
from torch.autograd import Variable
import numpy as np
# define our data generation function
def data_generator(data_size=1000):
# f(x) = y = x^2 + 4x - 3
inputs = []
labels = []
# loop data_size times to generate the data
for ix in range(data_size):
# generate a random number between 0 and 1000
x = np.random.randint(2000) / 1000 # I edited here for you
# calculate the y value using the function x^2 + 4x - 3
y = (x * x) + (4 * x) - 3
# append the values to our input and labels lists
inputs.append([x*x, x])
labels.append([y])
return inputs, labels
Определите вашу модель
# define the model
class Net(torch.nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = Linear(2, 1)
def forward(self, x):
return self.fc1(x)
model = Net()
Затем обучите ее, мы получим:
Epoch: 0 Loss: 33.75775909423828
Epoch: 1000 Loss: 0.00046704441774636507
Epoch: 2000 Loss: 9.437128483114066e-07
Epoch: 3000 Loss: 2.0870876138445738e-09
Epoch: 4000 Loss: 1.126847400112485e-11
Prediction: 5.355223655700684
Expected: [5.355224999999999]
Коэффициенты
Коэффициенты a
, b
,c
Вы ищете, на самом деле вес и уклон self.fc1
:
print('a & b:', model.fc1.weight)
print('c:', model.fc1.bias)
# Output
a & b: Parameter containing:
tensor([[1.0000, 4.0000]], requires_grad=True)
c: Parameter containing:
tensor([-3.0000], requires_grad=True)
Всего за 5000 эпох все сходятся: a
-> 1, b
-> 4,и c
-> -3.
Модель такая легкая, всего 3 параметра вместо:
(100 + 1) + (100 + 1) = 202 parameters in the old model
Надеюсь, это поможет вам!