建议给出model使用lstm的案例
Created by: Termset
https://github.com/PaddlePaddle/PARL/issues/91 这个issue也提到了构建lstm的问题
我简单尝试了,在IMPALA的model中加入lstm网络出现了错误
class AtariModel(parl.Model):
def __init__(self, act_dim):
self.conv1 = layers.conv2d(
num_filters=16, filter_size=4, stride=2, padding=1, act='relu')
self.conv2 = layers.conv2d(
num_filters=32, filter_size=4, stride=2, padding=2, act='relu')
self.conv3 = layers.conv2d(
num_filters=256, filter_size=11, stride=1, padding=0, act='relu')
self.lstm_cell = layers.LSTMCell(hidden_size=256)
self.policy_conv = layers.conv2d(
num_filters=act_dim,
filter_size=1,
stride=1,
padding=0,
act=None,
param_attr=ParamAttr(initializer=fluid.initializer.Normal()))
self.fc = layers.fc(size=256, act='relu')
self.action_fc = layers.fc(size=act_dim)
self.value_fc = layers.fc(
size=1,
param_attr=ParamAttr(initializer=fluid.initializer.Normal()))
def policy(self, obs):
"""
Args:
obs: A float32 tensor of shape [B, C, H, W]
Returns:
policy_logits: B * ACT_DIM
"""
obs = obs / 255.0
conv1 = self.conv1(obs)
conv2 = self.conv2(conv1)
conv3 = self.conv3(conv2) # (-1, 256, 1, 1)
flattened = layers.flatten(conv3, axis=1) # (-1, 256)
flattened = layers.unsqueeze(flattened, axes=-1)
lstm_out = layers.rnn(cell=self.lstm_cell, inputs=flattened)
policy_fc = self.fc(lstm_out)
policy_logits = self.action_fc(policy_fc)
# policy_conv = self.policy_conv(conv3) # (-1, 6, 1, 1)
# policy_logits = layers.flatten(policy_conv, axis=1) # (-1, 6)
return policy_logits
Traceback (most recent call last):
File "train.py", line 255, in <module>
learner = Learner(config)
File "train.py", line 56, in __init__
self.learn_data_provider)
File "/home/tianqi/PARL/examples/IMPALA/atari_agent.py", line 29, in __init__
super(AtariAgent, self).__init__(algorithm)
File "/home/tianqi/anaconda3/lib/python3.6/site-packages/parl/core/fluid/agent.py", line 79, in __init__
self.build_program()
File "/home/tianqi/PARL/examples/IMPALA/atari_agent.py", line 43, in build_program
self.sample_actions, self.behaviour_logits = self.alg.sample(obs)
File "/home/tianqi/anaconda3/lib/python3.6/site-packages/parl/algorithms/fluid/impala/impala.py", line 209, in sample
logits = self.model.policy(obs)
File "/home/tianqi/PARL/examples/IMPALA/atari_model.py", line 57, in policy
lstm_out = layers.rnn(cell=self.lstm_cell, inputs=flattened)
File "/home/tianqi/anaconda3/lib/python3.6/site-packages/paddle/fluid/layers/rnn.py", line 551, in rnn
outputs, new_states = cell.call(inputs, copy_states, **kwargs)
File "/home/tianqi/anaconda3/lib/python3.6/site-packages/paddle/fluid/layers/rnn.py", line 416, in call
new_hidden, new_cell = self.lstm_unit(inputs, pre_hidden, pre_cell)
File "/home/tianqi/anaconda3/lib/python3.6/site-packages/paddle/fluid/dygraph/layers.py", line 461, in __call__
outputs = self.forward(*inputs, **kwargs)
File "/home/tianqi/anaconda3/lib/python3.6/site-packages/paddle/fluid/contrib/layers/rnn_impl.py", line 820, in forward
layers.sigmoid(layers.elementwise_add(f, self._forget_bias))),
File "/home/tianqi/anaconda3/lib/python3.6/site-packages/paddle/fluid/layers/nn.py", line 12416, in elementwise_add
return _elementwise_op(LayerHelper('elementwise_add', **locals()))
File "/home/tianqi/anaconda3/lib/python3.6/site-packages/paddle/fluid/layers/nn.py", line 12237, in _elementwise_op
'use_mkldnn': use_mkldnn})
File "/home/tianqi/anaconda3/lib/python3.6/site-packages/paddle/fluid/layer_helper.py", line 43, in append_op
return self.main_program.current_block().append_op(*args, **kwargs)
File "/home/tianqi/anaconda3/lib/python3.6/site-packages/paddle/fluid/framework.py", line 2610, in append_op
attrs=kwargs.get("attrs", None))
File "/home/tianqi/anaconda3/lib/python3.6/site-packages/paddle/fluid/framework.py", line 1971, in __init__
self.desc.infer_shape(self.block.desc)
paddle.fluid.core_avx.EnforceNotMet:
--------------------------------------------
C++ Call Stacks (More useful to developers):
--------------------------------------------
0 std::string paddle::platform::GetTraceBackString<std::string const&>(std::string const&, char const*, int)
1 paddle::platform::EnforceNotMet::EnforceNotMet(std::string const&, char const*, int)
2 paddle::operators::ElementwiseOp::InferShape(paddle::framework::InferShapeContext*) const
3 paddle::framework::OpDesc::InferShape(paddle::framework::BlockDesc const&) const
------------------------------------------
Python Call Stacks (More useful to users):
------------------------------------------
File "/home/tianqi/anaconda3/lib/python3.6/site-packages/paddle/fluid/framework.py", line 2610, in append_op
attrs=kwargs.get("attrs", None))
File "/home/tianqi/anaconda3/lib/python3.6/site-packages/paddle/fluid/layer_helper.py", line 43, in append_op
return self.main_program.current_block().append_op(*args, **kwargs)
File "/home/tianqi/anaconda3/lib/python3.6/site-packages/paddle/fluid/layers/nn.py", line 12237, in _elementwise_op
'use_mkldnn': use_mkldnn})
File "/home/tianqi/anaconda3/lib/python3.6/site-packages/paddle/fluid/layers/nn.py", line 12416, in elementwise_add
return _elementwise_op(LayerHelper('elementwise_add', **locals()))
File "/home/tianqi/anaconda3/lib/python3.6/site-packages/paddle/fluid/contrib/layers/rnn_impl.py", line 820, in forward
layers.sigmoid(layers.elementwise_add(f, self._forget_bias))),
File "/home/tianqi/anaconda3/lib/python3.6/site-packages/paddle/fluid/dygraph/layers.py", line 461, in __call__
outputs = self.forward(*inputs, **kwargs)
File "/home/tianqi/anaconda3/lib/python3.6/site-packages/paddle/fluid/layers/rnn.py", line 416, in call
new_hidden, new_cell = self.lstm_unit(inputs, pre_hidden, pre_cell)
File "/home/tianqi/anaconda3/lib/python3.6/site-packages/paddle/fluid/layers/rnn.py", line 551, in rnn
outputs, new_states = cell.call(inputs, copy_states, **kwargs)
File "/home/tianqi/PARL/examples/IMPALA/atari_model.py", line 57, in policy
lstm_out = layers.rnn(cell=self.lstm_cell, inputs=flattened)
File "/home/tianqi/anaconda3/lib/python3.6/site-packages/parl/algorithms/fluid/impala/impala.py", line 209, in sample
logits = self.model.policy(obs)
File "/home/tianqi/PARL/examples/IMPALA/atari_agent.py", line 43, in build_program
self.sample_actions, self.behaviour_logits = self.alg.sample(obs)
File "/home/tianqi/anaconda3/lib/python3.6/site-packages/parl/core/fluid/agent.py", line 79, in __init__
self.build_program()
File "/home/tianqi/PARL/examples/IMPALA/atari_agent.py", line 29, in __init__
super(AtariAgent, self).__init__(algorithm)
File "train.py", line 56, in __init__
self.learn_data_provider)
File "train.py", line 255, in <module>
learner = Learner(config)
----------------------
Error Message Summary:
----------------------
NotFoundError: No Input(Y) found for ElementwiseOp operator.
[Hint: Expected ctx->HasInput("Y") == true, but received ctx->HasInput("Y"):0 != true:1.] at (/paddle/paddle/fluid/operators/elementwise/elementwise_op.h:42)
[operator < elementwise_add > error]