Search code examples
pythonregressionchainer

Regression with chainer


How can I do regression with Chainer?

Just replacing the usual L.Classifier with a loss function like F.mean_squared_error does not work, e.g.

from chainer import iterators, optimizers, training
from chainer import Chain
from chainer.datasets import mnist
import chainer.functions as F
import chainer.links as L
from chainer.training import extensions
import numpy as np


# simple addition data

N = 1000
x_ = np.random.choice(10, size=(N, 2)).astype(np.float32)
y_ = x_.sum(axis=1).astype(np.float32)
train = [(x[:,None], np.asarray([y])) for x, y in zip(x_, y_)]

train_iter = iterators.SerialIterator(train, 1000)

# model

class Model(Chain):
    def __init__(self):
        super(Model, self).__init__()

        with self.init_scope():
            self.l_out = L.Linear(2, 1)

    def forward(self, x):
        return self.l_out(x)

model = Model()
model = F.mean_squared_error(model)

# run

optimizer = optimizers.Adam()
optimizer.setup(model)

updater = training.updaters.StandardUpdater(train_iter, optimizer)
trainer = training.Trainer(updater, (1000, 'epoch'), out='mnist_result')
trainer.run()

gives an error:

TypeError: optimization target must be a link


Solution

  • Counter-intuitively, one still has to use L.Classifier for regression, e.g. for MSE:

    model = L.Classifier(model, lossfun=F.mean_squared_error, accfun=F.mean_squared_error)