前提・実現したいこと
Chainerを使ってオセロの棋譜を学習させたCNNを、今度はChainerRLのREINFORCEアルゴリズムを使って強化学習させようとしています。
しかし、掲載したコードを実行すると、agent.act_and_trainに呼ばれるmodel(Classifierでラップされている)で
TypeError: call() missing 1 required positional argument: 'x'
と出てしまいます。
引数でbatch_obsを取っているはずなのですが、どうしてでしょうか?
よろしくお願いします。
発生している問題・エラーメッセージ
Traceback (most recent call last): File "test_train.py", line 63, in <module> main() File "test_train.py", line 45, in main action = agent.act_and_train(obs, reward) File "C:\Users\26xor\Anaconda3\lib\site-packages\chainerrl\agents\reinforce.py", line 79, in act_and_train action_distrib = self.model(batch_obs) File "C:\Users\26xor\Anaconda3\lib\site-packages\chainer\links\model\classifier.py", line 114, in __call__ self.y = self.predictor(*args, **kwargs) TypeError: __call__() missing 1 required positional argument: 'x'
該当のソースコード
Python
1'''強化学習のコード''' 2 3model1 = L.Classifier(SLPolicy.SLPolicyNet(), lossfun=softmax_cross_entropy) # 対戦させるモデル 4serializers.load_npz("./models/rl/model0.npz", model1) 5optimizer = optimizers.Adam() 6optimizer.setup(model1) 7optimizer.add_hook(chainer.optimizer_hooks.WeightDecay(5e-4)) 8model2 = L.Classifier(SLPolicy.SLPolicyNet(), lossfun=softmax_cross_entropy) # 対戦相手のモデル 9serializers.load_npz("./models/rl/model0.npz", model2) 10# REINFORCEアルゴリズムのエージェント 11agent = chainerrl.agents.REINFORCE(model1, optimizer, batchsize=N, backward_separately=False) 12 13for set in range(args.set): 14 env = rl_env.GameEnv(model1, model2) 15 for i in range(2*N): 16 obs = env.reset() # 盤面を表す行列 17 reward = 0 18 done = False 19 while not done: 20 action = agent.act_and_train(obs, reward) 21 obs, reward, done, _ = env.step(action) 22 23 agent.stop_episode_and_train(obs, judge, done=True)
Python
1'''ネットワークを定義するクラス''' 2 3import chainer 4import chainer.functions as F 5import chainer.links as L 6 7class Block(chainer.Chain): 8 def __init__(self, out_channels, ksize, pad=1): 9 super(Block, self).__init__() 10 with self.init_scope(): 11 self.conv = L.Convolution2D(None, out_channels, ksize, pad=pad) 12 13 def __call__(self, x): 14 h = self.conv(x) 15 return F.relu(h) 16 17class SLPolicyNet(chainer.Chain): 18 def __init__(self): 19 ksize = 3 20 super(SLPolicyNet, self).__init__() 21 with self.init_scope(): 22 self.block1 = Block(64, ksize) 23 self.block2 = Block(128, ksize) 24 self.block3 = Block(128, ksize) 25 self.block4 = Block(128, ksize) 26 self.block5 = Block(128, ksize) 27 self.block6 = Block(128, ksize) 28 self.block7 = Block(128, ksize) 29 self.block8 = Block(128, ksize) 30 self.conv9 = L.Convolution2D(128, 1, 1, nobias=True) 31 self.bias10 = L.Bias(shape=(64)) 32 33 def __call__(self, x): # ここでエラー 34 h = self.block1(x) 35 h = self.block2(h) 36 h = self.block3(h) 37 h = self.block4(h) 38 h = self.block5(h) 39 h = self.block6(h) 40 h = self.block7(h) 41 h = self.block8(h) 42 h = self.conv9(h) 43 h = F.reshape(h, (-1,64)) 44 h = self.bias10(h) 45 return h
試したこと
ChainerRLのreinforce.pyをいじることもいろいろ試してみましたが、うまく動きません。
また、後でDistributionクラスが必要になって困ります。
補足情報(FW/ツールのバージョンなど)
Chainer 4.1.0
ChainerRL 0.3.0
Python 3.6.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。