3

我用 Openai Gym spaces.Tuple 构建了一个自定义环境,因为我的观察是由:小时(0-23)、日(1-7)、月(1-12)组成的,它们是离散的;四个连续数字,来自 csv 文件;和一个形状数组 (4*24),它们也来自一个 csv 文件。

self.observation_space = spaces.Tuple(spaces=(
                                             spaces.Box(low=-high, high=high, shape=(4,), dtype=np.float16),
                                             spaces.Box(low=-high, high=high, shape=(4, 24), dtype=np.float16),
                                             spaces.Discrete(24),
                                             spaces.Discrete(7),
                                             spaces.Discrete(12)))

这是我从 csv 文件中读取数据的 reset() 函数:

    def reset(self):
        index = 0
        hour = 0
        day = 1
        month = 6
        array1 = np.array([
            self.df.loc[index, 'A'],
            self.df.loc[index, 'B'],
            self.df.loc[index, 'C'],
            self.df.loc[index, 'D'],
        ], dtype=np.float16)
        array2 = np.array([
            self.df.loc[index: index+23, 'A'],
            self.df.loc[index: index+23, 'B'],
            self.df.loc[index: index+23, 'C'],
            self.df.loc[index: index+23, 'D'],
        ], dtype=np.float16)
        tup = (array1, array2, hour, day, month)
        return tup 

为了训练代理,我想使用 DQN 算法,它是来自keras-rl 库的 DQNAgent 这是我构建神经网络模型的代码:

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'))

据我了解,spaces.Tuple 实例没有 shape() 方法,len方法返回元组中的空格数。例如在我的环境中 len = 5

state = env.reset()
len = state.__len__()

但是要构建神经网络,我似乎需要 4 + 4*24 + 3 = 103 个输入神经元。我试图将输入维度硬编码为:

model.add(Flatten(input_shape=(1,) + (103,)))

但我收到以下错误:

ValueError:检查输入时出错:预期 flatten_1_input 的形状为 (1, 103),但得到的数组的形状为 (1, 5)。

所以我然后尝试:

model.add(Flatten(input_shape=(1,) + (env.observation_space.__len__(),)))

但我也得到了错误:

TypeError: only size-1 arrays can be convert to Python scalars 以上异常是以下异常的直接原因: Traceback (最近一次调用 last): File "C:/Users/yuche/Dropbox/risk hedging/rl-project /DqnDAMarketAgent.py",第 37 行,在 dqn.fit(env,nb_steps=1440,visualize=True,verbose=2) 文件“C:\Users\yuche\anaconda3\envs\py37\lib\site-packages\rl \core.py",第 169 行,适合动作 = self.forward(observation) 文件 "C:\Users\yuche\anaconda3\envs\py37\lib\site-packages\rl\agents\dqn.py",行228,在前向 q_values = self.compute_q_values(state) 文件“C:\Users\yuche\anaconda3\envs\py37\lib\site-packages\rl\agents\dqn.py”,第 69 行,在 compute_q_values q_values = self .compute_batch_q_values([state]).flatten() 文件“C:\Users\yuche\anaconda3\envs\py37\lib\site-packages\rl\agents\dqn.py”,第 64 行,compute_batch_q_values q_values = self.model.predict_on_batch(batch) 文件“C:\Users\yuche\anaconda3\envs\py37\lib\site-packages\keras\engine\training.py”,第 1580 行,在 predict_on_batch 输出 = self.predict_function(ins) 文件“C:\Users\yuche\anaconda3\envs\py37\lib\site-packages\tensorflow\python\keras\backend.py”,第 3277 行,在调用 dtype=tensor_type.as_numpy_dtype)) 文件“C:\Users\yuche\anaconda3\envs\py37\lib\site-packages\numpy\core_asarray.py”,第 83 行,在 asarray 返回数组(a,dtype,copy= False, order=order) ValueError: 使用序列设置数组元素。

我用谷歌搜索了这个错误并找到了可能的原因:

当您定义或构建的函数期望任何单个参数但获得一个数组时,就会发生这种情况。

看来我仍然需要 103 而不是 5 个神经元作为输入,但是 Tuple 直接将两个数组馈入网络。我想知道,DQN 中 Tuple 的典型用法是什么?

顺便说一句,我想出了一个使用 Spaces.Box 而不是 Spaces.Tuple 的方法:

self.observation_space = spaces.Box(low=-high, high=high, shape=(103,), dtype=np.float16) 

但这似乎不是最理想的方式。

提前致谢!

4

0 回答 0