Skip to content

Commit 2c49d1a

Browse files
committed
Commit for diff
1 parent c9841a4 commit 2c49d1a

2 files changed

Lines changed: 44 additions & 44 deletions

File tree

src/imitation/policies/replay_buffer_wrapper.py

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,13 @@ def __init__(
135135
k: Use the k'th nearest neighbor's distance when computing state entropy.
136136
**kwargs: keyword arguments for ReplayBuffer.
137137
"""
138+
# TODO should we limit by number of batches (as this does)
139+
# or number of observations returned?
140+
self.sample_count = 0
141+
self.entropy_as_reward_samples = entropy_as_reward_samples
142+
self.k = k
143+
# TODO support n_envs > 1
144+
self.entropy_stats = util.RunningMeanAndVar(shape=(1,))
138145
super().__init__(
139146
buffer_size,
140147
observation_space,
@@ -143,18 +150,14 @@ def __init__(
143150
reward_fn=reward_fn,
144151
**kwargs,
145152
)
146-
# TODO should we limit by number of batches (as this does)
147-
# or number of observations returned?
148-
self.samples = 0
149-
self.entropy_as_reward_samples = entropy_as_reward_samples
150-
self.k = k
151-
# TODO support n_envs > 1
152-
self.entropy_stats = util.RunningMeanAndVar(shape=(1,))
153153

154+
# TODO this seems to never actually get called?
154155
def sample(self, *args, **kwargs):
155-
self.samples += 1
156+
self.sample_count += 1
156157
samples = super().sample(*args, **kwargs)
157-
if self.samples > self.entropy_as_reward_samples:
158+
print(self.sample_count)
159+
print(self.entropy_as_reward_samples)
160+
if self.sample_count > 500:
158161
return samples
159162
# TODO we really ought to reset the reward network once we are done w/
160163
# the entropy based pre-training. We also have no reason to train
@@ -164,7 +167,12 @@ def sample(self, *args, **kwargs):
164167
all_obs = self.observations
165168
else:
166169
all_obs = self.observations[: self.pos]
167-
entropies = util.compute_state_entropy(samples.observations, all_obs, self.k)
170+
entropies = util.compute_state_entropy(
171+
# TODO support multiple environments
172+
samples.observations.unsqueeze(1),
173+
all_obs,
174+
self.k,
175+
)
168176

169177
# Normalize to have mean of 0 and standard deviation of 1
170178
self.entropy_stats.update(entropies)

tests/policies/test_replay_buffer_wrapper.py

Lines changed: 26 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from stable_baselines3.common import buffers, off_policy_algorithm, policies
1313
from stable_baselines3.common.policies import BasePolicy
1414
from stable_baselines3.common.save_util import load_from_pkl
15+
from stable_baselines3.common.vec_env import DummyVecEnv
1516

1617
from imitation.policies.replay_buffer_wrapper import (
1718
ReplayBufferEntropyRewardWrapper,
@@ -123,6 +124,7 @@ def test_wrapper_class(tmpdir, rng):
123124
def test_entropy_wrapper_class_no_op(tmpdir, rng):
124125
buffer_size = 15
125126
total_timesteps = 20
127+
entropy_samples = 0
126128

127129
venv = util.make_vec_env("Pendulum-v1", n_envs=1, rng=rng)
128130
rl_algo = sb3.SAC(
@@ -134,7 +136,7 @@ def test_entropy_wrapper_class_no_op(tmpdir, rng):
134136
replay_buffer_kwargs=dict(
135137
replay_buffer_class=buffers.ReplayBuffer,
136138
reward_fn=zero_reward_fn,
137-
entropy_as_reward_samples=0,
139+
entropy_as_reward_samples=entropy_samples,
138140
),
139141
buffer_size=buffer_size,
140142
)
@@ -172,8 +174,8 @@ class ActionIsObsEnv(gym.Env):
172174
def __init__(self):
173175
"""Initialize environment."""
174176
super().__init__()
175-
self.action_space = spaces.Discrete(50)
176-
self.observation_space = spaces.Discrete(50)
177+
self.action_space = spaces.Box(np.array([0]), np.array([1]))
178+
self.observation_space = spaces.Box(np.array([0]), np.array([1]))
177179

178180
def step(self, action):
179181
obs = action
@@ -183,17 +185,15 @@ def step(self, action):
183185
return obs, reward, done, info
184186

185187
def reset(self):
186-
return self.action_space.sample()
188+
return np.array([0])
187189

188190

189191
def test_entropy_wrapper_class(tmpdir, rng):
190-
buffer_size = 15
191-
entropy_samples = 10
192-
total_timesteps = 20
193-
194-
# TODO expect that our behavior is approximately uniformly distributed
192+
buffer_size = 20
193+
entropy_samples = 40
194+
k = 4
195195

196-
venv = util.make_vec_env("Pendulum-v1", n_envs=1, rng=rng)
196+
venv = DummyVecEnv([ActionIsObsEnv])
197197
rl_algo = sb3.SAC(
198198
policy=sb3.sac.policies.SACPolicy,
199199
policy_kwargs=dict(),
@@ -204,32 +204,24 @@ def test_entropy_wrapper_class(tmpdir, rng):
204204
replay_buffer_class=buffers.ReplayBuffer,
205205
reward_fn=zero_reward_fn,
206206
entropy_as_reward_samples=entropy_samples,
207+
k=k,
207208
),
208209
buffer_size=buffer_size,
209210
)
210211

211-
rl_algo.learn(total_timesteps=total_timesteps)
212-
213-
buffer_path = osp.join(tmpdir, "buffer.pkl")
214-
rl_algo.save_replay_buffer(buffer_path)
215-
replay_buffer_wrapper = load_from_pkl(buffer_path)
216-
replay_buffer = replay_buffer_wrapper.replay_buffer
217-
218-
# replay_buffer_wrapper.sample(...) should return zero-reward transitions
219-
assert buffer_size == replay_buffer_wrapper.size() == replay_buffer.size()
220-
assert (replay_buffer_wrapper.sample(total_timesteps).rewards == 0.0).all()
221-
assert (replay_buffer.sample(total_timesteps).rewards != 0.0).all() # seed=42
222-
223-
# replay_buffer_wrapper.pos, replay_buffer_wrapper.full
224-
assert replay_buffer_wrapper.pos == total_timesteps - buffer_size
225-
assert replay_buffer_wrapper.full
226-
227-
# reset()
228-
replay_buffer_wrapper.reset()
229-
assert 0 == replay_buffer_wrapper.size() == replay_buffer.size()
230-
assert replay_buffer_wrapper.pos == 0
231-
assert not replay_buffer_wrapper.full
212+
rl_algo.learn(total_timesteps=buffer_size)
213+
initial_entropy = util.compute_state_entropy(
214+
th.Tensor(rl_algo.replay_buffer.observations),
215+
th.Tensor(rl_algo.replay_buffer.observations),
216+
k=k,
217+
)
232218

233-
# to_torch()
234-
tensor = replay_buffer_wrapper.to_torch(np.ones(42))
235-
assert type(tensor) is th.Tensor
219+
rl_algo.learn(total_timesteps=entropy_samples - buffer_size)
220+
# Expect that the entropy of our replay buffer is now higher,
221+
# since we trained with that as the reward.
222+
trained_entropy = util.compute_state_entropy(
223+
th.Tensor(rl_algo.replay_buffer.observations),
224+
th.Tensor(rl_algo.replay_buffer.observations),
225+
k=k,
226+
)
227+
assert trained_entropy.mean() > initial_entropy.mean()

0 commit comments

Comments
 (0)