Custom linear equation fit

Dear community,
I’m a noob with Pytorch and I tried to fit the exponent of an equation with a custom activation fuction. However, I failed in defining it. Why?

import math

import torch
from torch.autograd import Variable
from torch import optim
from torch.nn.parameter import Parameter

class powerActivation(nn.Module):

    def __init__(self):
        super(powerActivation, self).__init__()
        self.weight = Parameter(torch.Tensor(1, 1))
        self.reset_parameters()

    def reset_parameters(self):
        self.weight.data.uniform_(1, 2)

    def forward(self, x):
        return x**self.weight

def build_model():
    model = torch.nn.Sequential()
    model.add_module("linear", powerActivation())
    return model

def train(model, loss, optimizer, x, y):
    x = Variable(x, requires_grad=False)
    y = Variable(y, requires_grad=False)

    # Reset gradient
    optimizer.zero_grad()

    # Forward
    fx = model.forward(x.view(len(x), 1))
    output = loss.forward(fx, y)

    # Backward
    output.backward()

    # Update parameters
    optimizer.step()

    return output.data[0]


def main():
    torch.manual_seed(42)
    X = torch.linspace(2, 10, 101)
    Y = X **2

    model = build_model()
    loss = torch.nn.MSELoss(size_average=True)
    optimizer = optim.SGD(model.parameters(), lr=0.1)
    batch_size = 10

    for i in range(20):
        cost = 0.
        num_batches = len(X) // batch_size
        for k in range(num_batches):
            start, end = k * batch_size, (k + 1) * batch_size
            cost += train(model, loss, optimizer, X[start:end], Y[start:end])
        print("Epoch = %d, cost = %s" % (i + 1, cost / num_batches))

    w = next(model.parameters()).data  # model has only one parameter
    print("w = %.2f" % w.numpy())  # will be approximately 2
    print(model(Variable(X)).data)
    print(list(zip(X,Y)))

main()

the result is:

Epoch = 1, cost = 2439.914280539751
Epoch = 2, cost = 2449.544422531128
Epoch = 3, cost = 2449.544422531128
Epoch = 4, cost = 2449.544422531128
Epoch = 5, cost = 2449.544422531128
Epoch = 6, cost = 2449.544422531128
Epoch = 7, cost = 2449.544422531128
Epoch = 8, cost = 2449.544422531128
Epoch = 9, cost = 2449.544422531128
Epoch = 10, cost = 2449.544422531128
Epoch = 11, cost = 2449.544422531128
Epoch = 12, cost = 2449.544422531128
Epoch = 13, cost = 2449.544422531128
Epoch = 14, cost = 2449.544422531128
Epoch = 15, cost = 2449.544422531128
Epoch = 16, cost = 2449.544422531128
Epoch = 17, cost = 2449.544422531128
Epoch = 18, cost = 2449.544422531128
Epoch = 19, cost = 2449.544422531128
Epoch = 20, cost = 2449.544422531128
w = -21.63

Thank you

1 Like

Your code works, if you lower the learning rate to approx. 1e-6.
I debugged by looking at the gradient at the beginning of the training and it was way to big for your learning rate.

Ohh! Thank you!

sry for the idiot question