我正在尝试在 openAI 健身房的一款游戏上实现 DQL 模型。但它给了我以下错误。
TypeError: len 没有为符号张量很好地定义。(activation_3/Identity:0) 请致电
x.shape而不是len(x)获取形状信息。
营造健身房环境:
ENV_NAME = 'CartPole-v0'
env = gym.make(ENV_NAME)
np.random.seed(123)
env.seed(123)
nb_actions = env.action_space.n
Run Code Online (Sandbox Code Playgroud)
我的模型看起来像这样:
model = Sequential()
model.add(Flatten(input_shape=(1,) + env.observation_space.shape))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(nb_actions))
model.add(Activation('linear'))
print(model.summary())
Run Code Online (Sandbox Code Playgroud)
将该模型拟合到来自 keral-rl 的 DQN 模型,如下所示:
policy = EpsGreedyQPolicy()
memory = SequentialMemory(limit=50000, window_length=1)
dqn = DQNAgent(model=model, nb_actions=nb_actions, memory=memory, nb_steps_warmup=10, target_model_update=0.001, policy=policy)
dqn.compile(Adam(lr=1e-3), metrics=['mse', 'mae'])
dqn.fit(env, nb_steps=5000, visualize=False, verbose=3)
Run Code Online (Sandbox Code Playgroud)
错误来自这一行:
dqn = DQNAgent(model=model, nb_actions=nb_actions, memory=memory, nb_steps_warmup=10, target_model_update=0.001, policy=policy)
Run Code Online (Sandbox Code Playgroud)
我正在使用 keras-rl==0.4.2 和 tensorflow==2.1.0。根据其他答案,我也尝试了 tensorflow==2.0.0-beta0 但它没有解决错误。
有人可以向我解释为什么我面临这个错误吗?以及如何解决? …
编辑:以下似乎也是如此FrozenLake-v0.请注意,我对简单的Q学习不感兴趣,因为我希望看到适用于连续观察空间的解决方案.
我最近创建了banana_gymOpenAI环境.方案如下:
你有一根香蕉.它必须在2天内出售,因为它在第3天会很糟糕.您可以选择价格x,但香蕉只会以概率出售
奖励为x - 1.如果第三天没有出售香蕉,则奖励为-1.(直觉:你为香蕉付了1欧元).因此,环境是非确定性的(随机的).
操作:您可以将价格设置为{0.00,0.10,0.20,...,2.00}中的任何值
观察:剩余时间(来源)
我计算了最优政策:
Opt at step 1: price 1.50 has value -0.26 (chance: 0.28)
Opt at step 2: price 1.10 has value -0.55 (chance: 0.41)
Run Code Online (Sandbox Code Playgroud)
这也符合我的直觉:首先尝试以更高的价格出售香蕉,因为如果你不卖它,你知道你还有另一种尝试.然后将价格降低到0.00以上.
我很确定这个是正确的,但为了完整起见
#!/usr/bin/env python
"""Calculate the optimal banana pricing policy."""
import math
import numpy as np
def main(total_time_steps, price_not_sold, chance_to_sell):
"""
Compare the optimal policy to a given policy.
Parameters
----------
total_time_steps : int
How often the agent may offer …Run Code Online (Sandbox Code Playgroud) python optimization reinforcement-learning openai-gym keras-rl
我是强化学习的完全新手,并一直在寻找一个框架/模块,以轻松导航这个危险的地形.在我的搜索中,我遇到了两个模块keras-rl和OpenAI GYM.
我可以让他们两个在他们的WIKI上共享的示例上工作,但是它们带有预定义的环境,并且几乎没有关于如何设置我自己的自定义环境的信息.
如果有人能指出我的教程,或者只是向我解释如何设置非游戏环境,我真的很感激?
我创建了一个自定义的 openai 健身房环境,其中包含离散的动作空间和稍微复杂的状态空间。状态空间被定义为元组,因为它结合了一些连续的维度和其他离散的维度:
import gym
from gym import spaces
class CustomEnv(gym.Env):
def __init__(self):
self.action_space = spaces.Discrete(3)
self.observation_space = spaces.Tuple((spaces.Discrete(16),
spaces.Discrete(2),
spaces.Box(0,20000,shape=(1,)),
spaces.Box(0,1000,shape=(1,)))
...
Run Code Online (Sandbox Code Playgroud)
我很幸运地使用 keras-rl(特别是 DQNAgent)训练了一个代理,但是 keras-rl 的支持不足且文档很少。对于可以处理此类观察空间的强化学习包有什么建议吗?目前看来 openai 基线和 stable-baselines 都无法处理它。
或者,是否有一种不同的方式可以定义我的状态空间,以便将我的环境适应这些定义更好的包之一?
python machine-learning reinforcement-learning openai-gym keras-rl
我在 keras-rl 中有一个自定义环境,在构造函数中有以下配置
def __init__(self, data):
#Declare the episode as the first episode
self.episode=1
#Initialize data
self.data=data
#Declare low and high as vectors with -inf values
self.low = numpy.array([-numpy.inf])
self.high = numpy.array([+numpy.inf])
self.observation_space = spaces.Box(self.low, self.high, dtype=numpy.float32)
#Define the space of actions as 3 (I want them to be 0, 1 and 2)
self.action_space = spaces.Discrete(3)
self.currentObservation = 0
self.limit = len(data)
#Initiates the values to be returned by the environment
self.reward = None
Run Code Online (Sandbox Code Playgroud)
如您所见,我的代理将执行 3 个动作,根据动作,将在下面的函数 step() 中计算不同的奖励:
def …Run Code Online (Sandbox Code Playgroud) 我试图从强化学习算法中理解一些代码。为了做到这一点,我试图打印张量的值。
我做了一段简单的代码来说明我的意思。
import tensorflow as tf
from keras import backend as K
x = K.abs(-2.0)
tf.Print(x,[x], 'x')
Run Code Online (Sandbox Code Playgroud)
目标是打印值“2”(-2 的绝对值)。但我只得到以下信息:
Using TensorFlow backend.
Process finished with exit code 0
Run Code Online (Sandbox Code Playgroud)
什么都没有,我怎么能像 print('...') 语句那样打印值 '2' 呢?
我正在使用 Gym 工具包来创建我自己的 env 和 keras-rl 在代理中使用我的 env。问题是我的行动空间发生了变化,这取决于实际状态。例如,我有 46 种可能的操作,但在特定状态下只有 7 种可用,而且我无法找到对其进行建模的方法。
我读过这个问题open-ai-environment-with-change-action-space-after-each-step
但这并没有解决我的问题。
在 Gym 文档中没有执行此操作的说明,只有他们的 Github 存储库(仍然打开)上的一个问题。我无法理解代理(keras-rl、dqn 代理)如何选择一个动作,它是随机选择的吗?但从哪里来?
有人可以帮助我吗?想法?
当我尝试训练批号大于1的代理程序时,它给了我一个例外。我的问题在哪里?
lr = 1e-3
window_length = 1
emb_size = 10
look_back = 6
# "Expert" (regular dqn) model architecture
inp = Input(shape=(look_back,))
emb = Embedding(input_dim=env.action_space.n+1, output_dim = emb_size)(inp)
rnn = Bidirectional(LSTM(5))(emb)
out = Dense(env.action_space.n, activation='softmax')(rnn)
expert_model = Model(inputs = inp, outputs = out)
expert_model.compile(loss='categorical_crossentropy', optimizer= Adam(lr))
print(expert_model.summary())
# memory
memory = PrioritizedMemory(limit=1000000, window_length=window_length)
# policy
policy = BoltzmannQPolicy()
# agent
dqn = DQNAgent(model=expert_model, nb_actions=env.action_space.n, policy=policy, memory=memory,
enable_double_dqn=False, enable_dueling_network=False, gamma=.9, batch_size = 100, #Here
target_model_update=1e-2, processor = RecoProcessor())
Run Code Online (Sandbox Code Playgroud)
我直接从keras-rl的代码中打印了一些值,它给出了以下输出:
State[array([0., 0., …Run Code Online (Sandbox Code Playgroud) 当使用下面的代码时,我收到此错误 AttributeError: 'Sequential' object has no attribute '_compile_time_distribution_strategy' with keras-rl2。
我搜索了整个互联网但找不到解决方案。
import gym
import tensorflow
print("Import Done")
env = gym.make("CartPole-v0")
states = env.observation_space.shape[0]
print(env.observation_space.shape)
actions = env.action_space.n
print(actions)
print(states)
print(env.observation_space)
print(env.action_space)
def build_model(nstates, nactions):
model = tensorflow.keras.models.Sequential()
model.add(tensorflow.keras.layers.Flatten(input_shape=(1, states)))
model.add(tensorflow.keras.layers.Dense(24, activation='relu'))
model.add(tensorflow.keras.layers.Dense(24, activation='relu'))
model.add(tensorflow.keras.layers.Dense(actions, activation='linear'))
return model
model = build_model(states, actions)
# print(model.summary())
from rl.agents import DQNAgent
from rl.policy import BoltzmannQPolicy
from rl.memory import SequentialMemory
def build_agent(model, actions):
policy = BoltzmannQPolicy()
memory = SequentialMemory(limit=50000, window_length=1)
dqn = DQNAgent(model=model, memory=memory, policy=policy, …Run Code Online (Sandbox Code Playgroud) 我找到了keras-rl/examples/cem_cartpole.py示例,我想了解,但没有找到文档。
线有什么作用
memory = EpisodeParameterMemory(limit=1000, window_length=1)
Run Code Online (Sandbox Code Playgroud)
做?什么是limit和 什么是window_length?增加其中一个/两个参数会产生什么影响?
我正在使用keras-rl通过D-DQN算法训练我的网络。我正在GPU上运行我的训练,该model.fit_generator()函数具有在反向执行时将数据发送到GPU 的功能。我怀疑与GPU处理数据的速度相比,数据的生成速度太慢。
在数据生成中,按照D-DQN算法的指示,我必须首先使用模型预测Q值,然后将这些值用于反向传播。如果使用GPU来运行这些预测,则意味着它们正在破坏我的数据流(我希望backprops尽可能频繁地运行)。
有什么方法可以指定在哪个设备上运行特定操作?以某种方式,我可以在CPU上运行预测,而在GPU上运行backprops。