開発のヒホ

iOSとかAndroidとかのアプリを開発するのに四苦八苦するブログ

TypeError: type object argument after * must be a sequence, not FunctionSet

 chainerでサンプルコードを動かすと、optimizer.setupでこけた。

>>> import numpy as np
>>> from chainer import cuda, Function, FunctionSet, gradient_check, Variable, optimizers, utils
>>> import chainer.functions as F
>>> model = FunctionSet(
...     l1 = F.Linear(4, 3),
...     l2 = F.Linear(3, 2),
... )
>>> optimizer = optimizers.SGD()
>>> optimizer.setup(model)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.4/site-packages/chainer/optimizer.py", line 51, in setup
    for p, g in zip(*params_grads):
TypeError: type object argument after * must be a sequence, not FunctionSet

 model内のl1やl2の勾配を設定していないことが原因だ。実はchainerはバージョン1.3.1辺りから、setupするだけで勾配の初期値を設定してくれるようになった。旧バージョンだと別の関数を叩く必要があるが、最新版はsetupだけで良いのだ。つまりこのエラーをなんとかするには、chainerのバージョンを上げればいい。

sudo pip3 install --upgrade chainer