ChainerのTrainer実行時にエラーが出る
Chainerを利用して、15入力3出力のニューラルネットワークを作成しようと思い、以下のコードを書きました。
# -*- coding:utf-8 -*-
import numpy as np
import chainer
from chainer.datasets import tuple_dataset
from chainer import Variable
from chainer import Function, gradient_check, report, training, utils, 
Variable
from chainer import datasets, iterators, optimizers, serializers
from chainer import Link, Chain, ChainList
import chainer.functions as F
import chainer.links as L
from chainer.training import extensions
import csv
batchsize = 10
epoch = 20
class NChain(Chain):
    def __init__(self):
        super(NChain, self).__init__()
        self.n_out = 3  # 出力数
        self.n_units = 8  # 中間層ノード数
        with self.init_scope():
            self.l1 = L.Linear(None, self.n_units)
            self.l2 = L.Linear(None, self.n_units)
        self.l3 = L.Linear(None, self.n_out)
    def __call__(self, x):
        h1 = F.relu(self.l1(x))
        h2 = F.relu(self.l2(h1))
        y = self.l3(h2)
        return y
class datasets():
    def get_data():
        train_data = []  # trainデータを格納
        train_enr = []  # trainの格納時に利用(15個で一つのデータのため)
        label_data = []  # 教師データ
        dataset_number = 0  # データ総数を格納
        # ファイル読み込み(./answer.csv)
        csvfile = './answer.csv'
        f = open(csvfile, "r")
        reader = csv.reader(f)
        # ヘッダーを読み飛ばす
        header = next(reader)
        # 教師データの作成
        for row in reader:
            # 入力
            if(len(row) - 1 == 5):
                for i in range(5):
                    train_enr.append(float(row[i]))
                if(len(train_enr) == 15):
                    train_data.append(
                        Variable(np.array(train_enr, 
dtype='float32')))
                    train_enr = []
            # 出力
            elif(len(row) - 1 == 3):
                label_data.append(
                    Variable(np.array([float(row[0]), float(row[1]), 
float(row[2])], dtype='float32')))
                # データ数を1カウント
                dataset_number += 1
        # データセットの8割をtrain, 2割をtest用にする
        threshold = int((dataset_number * 8) / 10)
        # Trainerで使えるように整形
        train = tuple_dataset.TupleDataset(
            train_data[0:threshold], label_data[0:threshold])
        test = tuple_dataset.TupleDataset(
            train_data[threshold:], label_data[threshold:])
        return train, test
def main():
    model = NChain()
    optimizer = optimizers.Adam()
    optimizer.setup(model)
    # データセット読み込み
    train, test = datasets.get_data()
    train_iter = chainer.iterators.SerialIterator(train, batchsize)
    test_iter = chainer.iterators.SerialIterator(test, batchsize,
                                                 repeat=False, 
shuffle=False)
    # Set up a trainer
    updater = training.StandardUpdater(train_iter, optimizer, 
device=None)
    trainer = training.Trainer(updater, (epoch, 'epoch'), 
out='result')
    trainer.extend(extensions.Evaluator(test_iter, model))
    trainer.extend(extensions.LogReport())
    trainer.extend(extensions.PrintReport(
        ['epoch', 'main/accuracy', 'validation/main/accuracy']))
    trainer.extend(extensions.ProgressBar())
    # Run the training
    trainer.run()
if __name__ == '__main__':
    main()
しかし、今までデータセットを自前で作成したりTrainerを使ったことがなかったのですが、練習のために試してみたところ以下のようなエラーが出ました。
Traceback (most recent call last):
  File "chainer_pl.py", line 115, in <module>
    main()
  File "chainer_pl.py", line 111, in main
    trainer.run()
  File "/usr/local/lib/python3.5/dist-
packages/chainer/training/trainer.py", line 296, in run
    update()
      File "/usr/local/lib/python3.5/dist-
packages/chainer/training/updater.py", line 223, in update
    self.update_core()
  File "/usr/local/lib/python3.5/dist-
packages/chainer/training/updater.py", line 234, in update_core
    optimizer.update(loss_func, *in_arrays)
  File "/usr/local/lib/python3.5/dist-packages/chainer/optimizer.py", 
line 527, in update
    loss = lossfun(*args, **kwds)
TypeError: __call__() takes 2 positional arguments but 3 were given
どうやらTrainerのUpdateの際のエラーなようですが、解決方法が分かりません。
どなたかご教示いただけますでしょうか。