質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenAI Gym

OpenAI Gymは、強化学習を開発・強化するためのシミュレーション環境です。強化学習における実験や評価環境などを標準化し提供することを目的としています。さらに、結果をアップロードしたり、他の人の実行結果や実装を見ることも可能です。

強化学習

強化学習とは、ある環境下のエージェントが現状を推測し行動を決定することで報酬を獲得するという見解から、その報酬を最大限に得る方策を学ぶ機械学習のことを指します。問題解決時に得る報酬が選択結果によって変化することで、より良い行動を選択しようと学習する点が特徴です。

Q&A

解決済

1回答

1384閲覧

Python dict型が勝手にarray型に変換されてしまっている...

ume_t

総合スコア2

OpenAI Gym

OpenAI Gymは、強化学習を開発・強化するためのシミュレーション環境です。強化学習における実験や評価環境などを標準化し提供することを目的としています。さらに、結果をアップロードしたり、他の人の実行結果や実装を見ることも可能です。

強化学習

強化学習とは、ある環境下のエージェントが現状を推測し行動を決定することで報酬を獲得するという見解から、その報酬を最大限に得る方策を学ぶ機械学習のことを指します。問題解決時に得る報酬が選択結果によって変化することで、より良い行動を選択しようと学習する点が特徴です。

1グッド

1クリップ

投稿2020/05/07 02:19

OoenAIが提供しているSafety Gymという強化学習シミュレーションツールでオリジナルの手法を動かしたく、トライ&エラーをしています。
強化学習の観測を調べており、githubで組んであるコードから予測される出力と異なるものが出力されます。

Python

1import safety_gym 2from safety_gym.envs.engine import Engine 3import numpy as np 4from gym.envs.registration import register 5import safety_gym.envs.world 6 7 8config = { 9 'robot_base': 'xmls/point.xml', 10 'task': 'goal', 11 12 # lidar ... 光の使って物体を認識 13 'observe_goal_lidar': True, # ゴールの認識 14 'observe_box_lidar': True,# pushタスクで押す箱の認識 15 'observe_hazards': True, # ハザードの認識 16 'observe_vases': True, # 花瓶の認識 17 'lidar_max_dist': 3, # lidarセンサの認識できる最大距離 18 'lidar_num_bins': 16, #lidarのbin数(光線の数?、認識できる物体の数?) 19 20 'constrain_hazards': True, # 危険な制約あり/なし 21 'placements_extents': [-1.5, -1.5, 1.5, 1.5], 22 'hazards_num': 8, # 危険ゾーンの個数 23 'vases_num': 1, # 花瓶の数 24 25 'task': 'goal', 26 'goal_size': 0.3, 27 'goal_keepout': 0.305, 28 'hazards_size': 0.2, 29 'hazards_keepout': 0.18, 30 31 '_seed':np.random.randint(2**16) # この様に変更しないとValueErrorが出る 32} 33 34register(id='SafexpTestEnvironment-v0', 35 entry_point='safety_gym.envs.mujoco:Engine', 36 kwargs={'config': config}) 37 38env = Engine(config) 39env.reset() 40env.obs()

上記のコードの出力が

Python

1array([ 0. , 0. , 9.81 , 0. , 0. , 2 0. , 0. , 0. , 0. , 0. , 3 0.32289485, 0.62832593, 0.30543109, 0. , 0. , 4 0. , 0. , 0. , 0. , 0. , 5 0. , 0. , 0. , 0. , 0. , 6 0. , 0. , 0. , 0. , 0.09979685, 7 0.25093581, 0.28346867, 0.31919212, 0.37231802, 0.55099259, 8 0.73966652, 0.18867394, 0. , -0.05594032, 0.49686083, 9 0. , 0. , 0. , 0. , 0. , 10 0. , 0. , 0. , 0. , 0. , 11 0. , 0.60760634, 0.78115352, 0.17354718, 0. , 12 0. , 0. , 0. , 0. , 0. ])

ですが、https://github.com/openai/safety-gym/blob/master/safety_gym/envs/engine.pyより

Python

1def obs(self): 2 ''' Return the observation of our agent ''' 3 self.sim.forward() # Needed to get sensordata correct 4 obs = {} 5 6 if self.observe_goal_dist: 7 obs['goal_dist'] = np.array([np.exp(-self.dist_goal())]) 8 if self.observe_goal_comp: 9 obs['goal_compass'] = self.obs_compass(self.goal_pos) 10 if self.observe_goal_lidar: 11 obs['goal_lidar'] = self.obs_lidar([self.goal_pos], GROUP_GOAL) 12 if self.task == 'push': 13 box_pos = self.box_pos 14 if self.observe_box_comp: 15 obs['box_compass'] = self.obs_compass(box_pos) 16 if self.observe_box_lidar: 17 obs['box_lidar'] = self.obs_lidar([box_pos], GROUP_BOX) 18 if self.task == 'circle' and self.observe_circle: 19 obs['circle_lidar'] = self.obs_lidar([self.goal_pos], GROUP_CIRCLE) 20 if self.observe_freejoint: 21 joint_id = self.model.joint_name2id('robot') 22 joint_qposadr = self.model.jnt_qposadr[joint_id] 23 assert joint_qposadr == 0 # Needs to be the first entry in qpos 24 obs['freejoint'] = self.data.qpos[:7] 25 if self.observe_com: 26 obs['com'] = self.world.robot_com() 27 if self.observe_sensors: 28 # Sensors which can be read directly, without processing 29 for sensor in self.sensors_obs: # Explicitly listed sensors 30 obs[sensor] = self.world.get_sensor(sensor) 31 for sensor in self.robot.hinge_vel_names: 32 obs[sensor] = self.world.get_sensor(sensor) 33 for sensor in self.robot.ballangvel_names: 34 obs[sensor] = self.world.get_sensor(sensor) 35 # Process angular position sensors 36 if self.sensors_angle_components: 37 for sensor in self.robot.hinge_pos_names: 38 theta = float(self.world.get_sensor(sensor)) # Ensure not 1D, 1-element array 39 obs[sensor] = np.array([np.sin(theta), np.cos(theta)]) 40 for sensor in self.robot.ballquat_names: 41 quat = self.world.get_sensor(sensor) 42 obs[sensor] = quat2mat(quat) 43 else: # Otherwise read sensors directly 44 for sensor in self.robot.hinge_pos_names: 45 obs[sensor] = self.world.get_sensor(sensor) 46 for sensor in self.robot.ballquat_names: 47 obs[sensor] = self.world.get_sensor(sensor) 48 if self.observe_remaining: 49 obs['remaining'] = np.array([self.steps / self.num_steps]) 50 assert 0.0 <= obs['remaining'][0] <= 1.0, 'bad remaining {}'.format(obs['remaining']) 51 if self.walls_num and self.observe_walls: 52 obs['walls_lidar'] = self.obs_lidar(self.walls_pos, GROUP_WALL) 53 if self.observe_hazards: 54 obs['hazards_lidar'] = self.obs_lidar(self.hazards_pos, GROUP_HAZARD) 55 if self.observe_vases: 56 obs['vases_lidar'] = self.obs_lidar(self.vases_pos, GROUP_VASE) 57 if self.gremlins_num and self.observe_gremlins: 58 obs['gremlins_lidar'] = self.obs_lidar(self.gremlins_obj_pos, GROUP_GREMLIN) 59 if self.pillars_num and self.observe_pillars: 60 obs['pillars_lidar'] = self.obs_lidar(self.pillars_pos, GROUP_PILLAR) 61 if self.buttons_num and self.observe_buttons: 62 # Buttons observation is zero while buttons are resetting 63 if self.buttons_timer == 0: 64 obs['buttons_lidar'] = self.obs_lidar(self.buttons_pos, GROUP_BUTTON) 65 else: 66 obs['buttons_lidar'] = np.zeros(self.lidar_num_bins) 67 if self.observe_qpos: 68 obs['qpos'] = self.data.qpos.copy() 69 if self.observe_qvel: 70 obs['qvel'] = self.data.qvel.copy() 71 if self.observe_ctrl: 72 obs['ctrl'] = self.data.ctrl.copy() 73 if self.observe_vision: 74 obs['vision'] = self.obs_vision() 75 if self.observation_flatten: 76 flat_obs = np.zeros(self.obs_flat_size) 77 offset = 0 78 for k in sorted(self.obs_space_dict.keys()): 79 k_size = np.prod(obs[k].shape) 80 flat_obs[offset:offset + k_size] = obs[k].flat 81 offset += k_size 82 obs = flat_obs 83 assert self.observation_space.contains(obs), f'Bad obs {obs} {self.observation_space}' 84 return obs

このようにself.obs()の出力はdict型であるはずなのに、作成したコードの出力はarray型のオブジェクトが出力されます。

なぜこのような事が起こるのでしょうか。
ご存じの方教えてください。
よろしくお願いいたします。

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

変数が使いまわされてるけど、ここではないでしょうか。

  • flat_obs = np.zeros(...)
  • obs = flat_obs

python

1 if self.observation_flatten: 2 flat_obs = np.zeros(self.obs_flat_size) 3 offset = 0 4 for k in sorted(self.obs_space_dict.keys()): 5 k_size = np.prod(obs[k].shape) 6 flat_obs[offset:offset + k_size] = obs[k].flat 7 offset += k_size 8 obs = flat_obs
  • 条件となる observation_flatten のデフォルト値は同ファイルより。
'observation_flatten': True, # Flatten observation into a vector

configで設定を上書きできるはずです。

投稿2020/05/09 05:35

teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ume_t

2020/05/14 05:58

お返事が遅くなってしまい申し訳ありません。 obs関数内で変換されていたのですね。 見落としてしまっていました。 理解する事が出来ました。 ご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問