-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathevaluation.py
More file actions
75 lines (59 loc) · 2.29 KB
/
Copy pathevaluation.py
File metadata and controls
75 lines (59 loc) · 2.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import gym
import numpy as np
import utils
max_mean_score = -np.inf
def evaluate(DQA, args, logger):
global max_mean_score
evaluation_csv = 'evaluation.csv'
logger.to_csv(evaluation_csv, 'length,score')
env = gym.make(args.environment)
scores = list()
frame_counter = 0
while frame_counter < args.validation_frames:
remaining_random_actions = args.initial_random_actions
obs = utils.preprocess_observation(env.reset())
frame_counter += 1
# Initialize the first state with the same 4 images
current_state = np.array([obs, obs, obs, obs])
t = 0
episode = 0
score = 0
# Start episode
while True:
# Render the game if video output is not suppressed
if args.video:
env.render()
action = DQA.get_action(np.asarray([current_state]),
testing=True,
force_random=remaining_random_actions > 0)
obs, reward, done, info = env.step(action)
obs = utils.preprocess_observation(obs)
current_state = utils.get_next_state(current_state, obs)
if remaining_random_actions > 0:
remaining_random_actions -= 1
score += reward
t += 1
frame_counter += 1
# End episode
if done or t > args.max_episode_length:
episode += 1
print('Episode %d end\n---------------\nFrame counter: %d\n' %
(episode, frame_counter))
print('Length: %d\n, Score: %f\n\n' % (t, score))
# Save episode data in the evaluation csv
logger.to_csv(evaluation_csv, [t, score])
break
scores.append([t, score])
print('mean scores:')
print(np.mean(scores))
scores = np.asarray(scores)
max_indices = np.argwhere(scores[:, 1] == np.max(scores[:, 1])).ravel()
max_idx = np.random.choice(max_indices)
# Save best model
print('mean scores:')
print(np.mean(scores))
if max_mean_score < np.mean(scores):
max_mean_score = np.mean(scores)
DQA.DQN.save(append='_best')
print('saved best model')
return scores[max_idx, :].ravel()