我正在构建一个定义了模型的RL代理:
def build_model(height,width,channels,actions):
model = Sequential()
model.add(Conv2D(32,(8,8),strides=(4,4),activation='relu',input_shape=(3,height,width,channels)))
model.add(Conv2D(64,(4,4),strides=(2,2),activation='relu'))
model.add(Dense(512,activation='relu'))
model.add(Dense(256,activation='relu'))
model.add(Dense(actions,activation='linear'))
return model
然后创建了一个模型:
env = gym.make('SpaceInvaders-v0')
height,width,channels = env.observation_space.shape
actions = env.action_space.n
model = build_model(height,width,channels,actions)
然后定义Agent:
def build_agent(model,actions):
policy = LinearAnnealedPolicy(EpsGreedyQPolicy(),attr='eps',value_max=1,value_min=.1,value_test=-.2, nb_steps=10000)
memory = SequentialMemory(limit=2000,window_length=3)
dqn = DQNAgent(model=model,memory=memory,policy=policy,dueling_type='avg',nb_actions=actions,nb_steps_warmup=1000)
当我尝试建立代理时:
dqn = build_agent(model,actions)
我得到这个错误:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-100-320eef5d391d> in <module>
----> 1 dqn = build_agent(model,actions)
<ipython-input-95-97801a497208> in build_agent(model, actions)
2 policy = LinearAnnealedPolicy(EpsGreedyQPolicy(),attr='eps',value_max=1,value_min=.1,value_test=-.2, nb_steps=10000)
3 memory = SequentialMemory(limit=2000,window_length=3)
----> 4 dqn = DQNAgent(model=model,memory=memory,policy=policy,dueling_type='avg',nb_actions=actions,nb_steps_warmup=1000)
~/Documents/RL/pRL/lib/python3.8/site-packages/rl/agents/dqn.py in __init__(self, model, policy, test_policy, enable_double_dqn, enable_dueling_network, dueling_type, *args, **kwargs)
105 # Validate (important) input.
106 if list(model.output.shape) != list((None, self.nb_actions)):
--> 107 raise ValueError(f'Model output "{model.output}" has invalid shape. DQN expects a model that has one dimension for each action, in this case {self.nb_actions}.')
108
109 # Parameters.
ValueError: Model output "Tensor("dense_30/BiasAdd:0", shape=(None, 3, 24, 18, 6), dtype=float32)" has invalid shape. DQN expects a model that has one dimension for each action, in this case 6.
我检查了model.output.shape和self.nb_actions:的值
print(model.output_shape)
# (None, 3, 24, 18, 6)
print(actions) # This is self.nb_action
# 6
我不知道"model.output"的形状应该是什么。在这个错误中,它看起来应该是"(None,6(",但我不知道我必须做什么更改才能得到这个形状。
将model.output.shape转换为元组,然后比较if元组(model.output.shape(!=(无,4(
刚刚尝试了所有的方法,并到处寻找答案,请注意,在模型摘要中,输入已经是三维的。因此添加一个平坦层解决了我的问题
def build_model(height,width,channels,actions):
model = Sequential()
model.add(Conv2D(32,(8,8),strides=(4,4),activation='relu',input_shape=(3,height,width,channels)))
model.add(Conv2D(64,(4,4),strides=(2,2),activation='relu'))
model.add(Dense(512,activation='relu'))
model.add(Dense(256,activation='relu'))
model.add(Flatten()) #add it anywhere you want tbh <<<<<<<<<<<<<<<<<<<<
model.add(Dense(actions,activation='linear'))
return model