බහු-සැකසුම්සමග Atari දවටනය

9import multiprocessing
10import multiprocessing.connection
11
12import cv2
13import gym
14import numpy as np

ක්රීඩාපරිසරය

මෙයOpenAI ජිම් ක්රීඩා පරිසරය සඳහා ඔතා. අපි මෙහි කරුණු කිහිපයක් කරන්නෙමු:

1. රාමු හතරක් මත එකම ක්රියාව යොදන්න සහ අවසාන රාමුව 2 ලබා ගන්න. නිරීක්ෂණ රාමු අළු පැහැයට පරිවර්තනය කර පරිමාණය කරන්න (84, 84) 3. අවසාන ක්රියා හතරේ රාමු හතරක් ගොඩගසන්න 4. 5 අධීක්ෂණය සඳහා කථාංග තොරතුරු එක් කරන්න (සමස්ත කථාංගය සඳහා සම්පූර්ණ විපාකය). කථාංගයක් තනි ජීවිතයකට සීමා කරන්න (ක්රීඩාවට ජීවිත 5 ක් ඇත, සෑම ජීවිතයකටම පසු අපි නැවත සකස් කරමු)

නිරීක්ෂණආකෘතිය

නිරීක්ෂණයයනු ප්රමාණයේ ආතන්ය (4, 84, 84). එය රාමු හතරක් (ක්රීඩා තිරයේ රූප) පළමු අක්ෂය මත එකමත. එනම්, එක් එක් නාලිකාව රාමුවක් වේ.

17class Game:
38    def __init__(self, seed: int):

පරිසරයනිර්මාණය කරන්න

40        self.env = gym.make('BreakoutNoFrameskip-v4')
41        self.env.seed(seed)

රාමු4 ක් සඳහා ටෙන්සර්

44        self.obs_4 = np.zeros((4, 84, 84))

අවසානරාමු 2 හි උපරිමය තබා ගැනීමට බෆරය

47        self.obs_2_max = np.zeros((2, 84, 84))

කථාංගවිපාක පිළිබඳ වාර්තාවක් තබා ගන්න

50        self.rewards = []

සහජීවිත ගණන

52        self.lives = 0

පියවර

action සඳහා ක්රියාත්මක 4 කාලය පියවර සහ ක tuple ආපසු (නිරීක්ෂණ, විපාකය, සිදු, episode_info).

  • observation : රාමු 4 ක් (අවසාන ක්රියා 3 සඳහා මෙම රාමුව සහ රාමු)
  • reward : ක්රියාව ක්රියාත්මක කරන ලද අතර සම්පූර්ණ විපාකය
  • done : කථාංගය අවසන් වේවා (ජීවිතයක් අහිමි විය)
  • episode_info : සම්පූර්ණ නම් කථාංග තොරතුරු
54    def step(self, action):
66        reward = 0.
67        done = None

පියවර4 ක් සඳහා ධාවනය කරන්න

70        for i in range(4):

OpenAIජිම්නේසියම පරිසරය තුළ ක්රියාව ක්රියාත්මක

72            obs, r, done, info = self.env.step(action)
73
74            if i >= 2:
75                self.obs_2_max[i % 2] = self._process_obs(obs)
76
77            reward += r

ජීවිතගණන ඉතිරි කර ගන්න

80            lives = self.env.unwrapped.ale.lives()

ජීවිතයක්නැති වුවහොත් නැවත සකසන්න

82            if lives < self.lives:
83                done = True
84                break

එක්එක් පියවර සඳහා ත්යාග පවත්වා ගන්න

87        self.rewards.append(reward)
88
89        if done:

අවසන්නම්, කථාංගය අවසන් නම් කථාංග තොරතුරු සකසන්න, සහ නැවත සකසන්න

91            episode_info = {"reward": sum(self.rewards), "length": len(self.rewards)}
92            self.reset()
93        else:
94            episode_info = None

අවසානරාමු දෙකේ උපරිම ලබා ගන්න

97            obs = self.obs_2_max.max(axis=0)

රාමු4 ක තොගයට එය තල්ලු කරන්න

100            self.obs_4 = np.roll(self.obs_4, shift=-1, axis=0)
101            self.obs_4[-1] = obs
102
103        return self.obs_4, reward, done, episode_info

පරිසරයයළි පිහිටුවන්න

කථාංගතොරතුරු සහ රාමු 4 ක් පිරිසිදු කරන්න

105    def reset(self):

OpenAIGym පරිසරය

112        obs = self.env.reset()

හැඹිලිනැවත සකසන්න

115        obs = self._process_obs(obs)
116        for i in range(4):
117            self.obs_4[i] = obs
118        self.rewards = []
119
120        self.lives = self.env.unwrapped.ale.lives()
121
122        return self.obs_4

ක්රියාවලියක්රීඩාව රාමු

ක්රීඩාරාමු අළු බවට පරිවර්තනය කර 84x84 බවට නැවත සකස් කරන්න

124    @staticmethod
125    def _process_obs(obs):
130        obs = cv2.cvtColor(obs, cv2.COLOR_RGB2GRAY)
131        obs = cv2.resize(obs, (84, 84), interpolation=cv2.INTER_AREA)
132        return obs

සේවකක්රියාවලිය

සෑමසේවක ක්රියාවලියක්ම මෙම ක්රමය ක්රියාත්මක කරයි

135def worker_process(remote: multiprocessing.connection.Connection, seed: int):

ක්රීඩාවසාදන්න

143    game = Game(seed)

සම්බන්ධතාවයෙන්උපදෙස් බලා ඒවා ක්රියාත්මක කරන්න

146    while True:
147        cmd, data = remote.recv()
148        if cmd == "step":
149            remote.send(game.step(data))
150        elif cmd == "reset":
151            remote.send(game.reset())
152        elif cmd == "close":
153            remote.close()
154            break
155        else:
156            raise NotImplementedError

නවසේවකයෙකු නිර්මාණය කර එය වෙනම ක්රියාවලියක් තුළ ක්රියාත්මක කරයි.

159class Worker:
164    def __init__(self, seed):
165        self.child, parent = multiprocessing.Pipe()
166        self.process = multiprocessing.Process(target=worker_process, args=(parent, seed))
167        self.process.start()