我试图了解MLP如何用于非线性回归。为此,我简单地生成了一个数据集:y = x ^ 2。当我运行我的代码时,结果并不匹配: graphed here
我的问题是如何让MLP更准确地代表这个功能?另外我很担心,因为我的近似看起来仍然是线性的 - 而我期待它开始弯曲?
以下是我在pytorch中的代码尝试。这包括nn.linear图层(我解释为MLP)以及tanh激活函数,它使分类器非线性:
#generate data
for i in range(0,15):
case = 1
foo = np.random.uniform(0,1)
#parabolic
if(case == 1):
x_train[i] = foo
y_train[i] = foo**2
x_train = torch.from_numpy(x_train)
y_train = torch.from_numpy(y_train)
# Linear Regression Model
class LinearRegression(nn.Module):
def __init__(self):
super(LinearRegression, self).__init__()
hidden = 100 #i've tried values between 5-1000
self.classifier = nn.Sequential(
nn.Linear(1, hidden),
torch.nn.Tanh(),
nn.Linear(hidden, 1),
torch.nn.Tanh(),
)
self.linear = nn.Linear(1, 1) # input and output is 1 dimension
def forward(self, x):
out = self.classifier(x)
#out = self.linear(x)
return out
model = LinearRegression()
# loss + optimization
criterion = nn.MSELoss(size_average=False)
optimizer = optim.SGD(model.parameters(), lr=1e-4)
#
num_epochs = 1000
for epoch in range(num_epochs):
inputs = Variable(x_train)
target = Variable(y_train)
# forward
out = model(inputs)
loss = criterion(out, target)
# backward
optimizer.zero_grad()
loss.backward()
optimizer.step()
谢谢!
编辑1 我在sine(x)= y函数上得到了更清晰的结果。 Tanh Activation Function
我认为至少证明我的MLP脚本可以进行非线性回归。虽然从图像我仍然希望更准确的近似。准确性似乎主要是神经元(隐藏层)和时代运行的函数。