调整多层感知器以进行非线性回归

时间:2018-06-18 19:03:57

标签: python machine-learning pytorch perceptron non-linear-regression

我试图了解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脚本可以进行非线性回归。虽然从图像我仍然希望更准确的近似。准确性似乎主要是神经元(隐藏层)和时代运行的函数。

0 个答案:

没有答案