Openai Gym のスペースを使用してカスタム環境を構築しました。csv ファイルからの 4 つの連続した数字。および形状の配列 (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
エージェントをトレーニングするために、 keras-rl ライブラリの DQNAgent である DQN アルゴリズムを使用したいと思い ます。ニューラル ネットワーク モデルを構築するコードは次のとおりです。
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: サイズ 1 の配列のみを Python スカラーに変換できます 上記の例外は、次の例外の直接の原因でした: Traceback (most recent call 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 行目、fit action = self.forward(observation) File "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 行目call 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: 配列要素をシーケンスで設定しています。
私はこのエラーをグーグルで検索し、考えられる理由を見つけました:
これは、定義済みまたは構築済みの関数が単一のパラメーターを期待しているにもかかわらず、配列を取得している間に発生します。
入力として 5 個のニューロンではなく 103 個のニューロンが必要なようですが、Tuple はネットワークに 2 つの配列を直接フィードします。DQN での Tuple の一般的な使用法は何ですか?
ところで、Spaces.Tuple の代わりに Spaces.Box を使用するメソッドを思いつきました。
self.observation_space = spaces.Box(low=-high, high=high, shape=(103,), dtype=np.float16)
しかし、これは最も理想的な方法ではないようです。
前もって感謝します!