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
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)