Emin commited on
Commit
bb2a8dd
1 Parent(s): d270093

Delete RL_Mario.ipynb

Browse files
Files changed (1) hide show
  1. RL_Mario.ipynb +0 -419
RL_Mario.ipynb DELETED
@@ -1,419 +0,0 @@
1
- {
2
- "cells": [
3
- {
4
- "cell_type": "code",
5
- "execution_count": 3,
6
- "id": "662ad46f",
7
- "metadata": {},
8
- "outputs": [],
9
- "source": [
10
- "#!pip install gym_super_mario_bros==7.3.0 nes_py"
11
- ]
12
- },
13
- {
14
- "cell_type": "code",
15
- "execution_count": 4,
16
- "id": "b960b503",
17
- "metadata": {},
18
- "outputs": [],
19
- "source": [
20
- "# Import the game\n",
21
- "import gym_super_mario_bros\n",
22
- "# Import the Joypad wrapper\n",
23
- "from nes_py.wrappers import JoypadSpace\n",
24
- "# Import the SIMPLIFIED controls\n",
25
- "from gym_super_mario_bros.actions import SIMPLE_MOVEMENT"
26
- ]
27
- },
28
- {
29
- "cell_type": "code",
30
- "execution_count": 5,
31
- "id": "534eb3ad",
32
- "metadata": {},
33
- "outputs": [],
34
- "source": [
35
- "# Setup game\n",
36
- "env = gym_super_mario_bros.make('SuperMarioBros-v0')\n",
37
- "env = JoypadSpace(env, SIMPLE_MOVEMENT)"
38
- ]
39
- },
40
- {
41
- "cell_type": "code",
42
- "execution_count": 6,
43
- "id": "226ba288",
44
- "metadata": {},
45
- "outputs": [
46
- {
47
- "data": {
48
- "text/plain": [
49
- "'# Create a flag - restart or not\\ndone = True\\n# Loop through each frame in the game\\nfor step in range(100000): \\n # Start the game to begin with \\n if done: \\n # Start the gamee\\n env.reset()\\n # Do random actions\\n state, reward, done, info = env.step(env.action_space.sample())\\n # Show the game on the screen\\n env.render()\\n# Close the game\\nenv.close()'"
50
- ]
51
- },
52
- "execution_count": 6,
53
- "metadata": {},
54
- "output_type": "execute_result"
55
- }
56
- ],
57
- "source": [
58
- "'''# Create a flag - restart or not\n",
59
- "done = True\n",
60
- "# Loop through each frame in the game\n",
61
- "for step in range(100000): \n",
62
- " # Start the game to begin with \n",
63
- " if done: \n",
64
- " # Start the gamee\n",
65
- " env.reset()\n",
66
- " # Do random actions\n",
67
- " state, reward, done, info = env.step(env.action_space.sample())\n",
68
- " # Show the game on the screen\n",
69
- " env.render()\n",
70
- "# Close the game\n",
71
- "env.close()'''"
72
- ]
73
- },
74
- {
75
- "cell_type": "code",
76
- "execution_count": 7,
77
- "id": "3af3fa30",
78
- "metadata": {},
79
- "outputs": [],
80
- "source": [
81
- "#2. Preprocess Environment"
82
- ]
83
- },
84
- {
85
- "cell_type": "code",
86
- "execution_count": 8,
87
- "id": "63991611",
88
- "metadata": {},
89
- "outputs": [],
90
- "source": [
91
- "# Install pytorch\n",
92
- "#!pip install torch==1.10.1+cu113 torchvision==0.11.2+cu113 torchaudio===0.10.1+cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html"
93
- ]
94
- },
95
- {
96
- "cell_type": "code",
97
- "execution_count": 9,
98
- "id": "a0f2afef",
99
- "metadata": {},
100
- "outputs": [],
101
- "source": [
102
- "# Install stable baselines for RL stuff\n",
103
- "#!pip install stable-baselines3[extra]"
104
- ]
105
- },
106
- {
107
- "cell_type": "code",
108
- "execution_count": 10,
109
- "id": "77c04eaf",
110
- "metadata": {},
111
- "outputs": [],
112
- "source": [
113
- "# Import Frame Stacker Wrapper and GrayScaling Wrapper\n",
114
- "from gym.wrappers import GrayScaleObservation\n",
115
- "# Import Vectorization Wrappers\n",
116
- "from stable_baselines3.common.vec_env import VecFrameStack, DummyVecEnv\n",
117
- "# Import Matplotlib to show the impact of frame stacking\n",
118
- "from matplotlib import pyplot as plt"
119
- ]
120
- },
121
- {
122
- "cell_type": "code",
123
- "execution_count": 11,
124
- "id": "a7358092",
125
- "metadata": {},
126
- "outputs": [],
127
- "source": [
128
- "# 1. Create the base environment\n",
129
- "env = gym_super_mario_bros.make('SuperMarioBros-v0')\n",
130
- "# 2. Simplify the controls \n",
131
- "env = JoypadSpace(env, SIMPLE_MOVEMENT)\n",
132
- "# 3. Grayscale\n",
133
- "env = GrayScaleObservation(env, keep_dim=True)\n",
134
- "# 4. Wrap inside the Dummy Environment\n",
135
- "env = DummyVecEnv([lambda: env])\n",
136
- "# 5. Stack the frames\n",
137
- "env = VecFrameStack(env, 4, channels_order='last')"
138
- ]
139
- },
140
- {
141
- "cell_type": "code",
142
- "execution_count": 12,
143
- "id": "6105008f",
144
- "metadata": {},
145
- "outputs": [],
146
- "source": [
147
- "state = env.reset()"
148
- ]
149
- },
150
- {
151
- "cell_type": "code",
152
- "execution_count": 16,
153
- "id": "46a3a5ee",
154
- "metadata": {},
155
- "outputs": [],
156
- "source": [
157
- "state, reward, done, info = env.step([5])"
158
- ]
159
- },
160
- {
161
- "cell_type": "code",
162
- "execution_count": 17,
163
- "id": "194eeca2",
164
- "metadata": {},
165
- "outputs": [
166
- {
167
- "data": {
168
- "image/png": "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s277FCB4k8YfdZ4ZfKVhJl7r4vlds3rMFjPQYn3mIGWRsuhEKYuURQNFeaQ8OlHKo+HPo2OZxUwDRCIyYDRAdHSeVC8LJpUAsL0mN3QAdNiMaeVkJwZvXLhy+/TwNz6XZVFR8PP0h9pS2VE8Nqxtbn49BZnVAKzZN7nHVK+Hz2L4rMOabVPD1iWM6uC0CaUAbK3OG5ADIICkkgRG7bM4fosJQPUpBl+WD0zwfefMWXt4a+u00PbNm1bGxp0Tu9pntHPquDIANlWN7TETx7zCUlLcwc+zr9w6fUBqPlEnFZaR5m4PWxbAdG3nUYybUMPkUbU9lvfYF4bRnIL9pHvawmsysGhmcP9q8CaFDs4PSx/dzJzcCgDWlU0cktlHYv2PMmWRsuhEKYuURQNFeaQ8OlHKo+HPIw0Qiciw0ACRHCmpLIHEQ9A0OYA/wx86ABIZTLH+R5myaOApi2Q4xHoWgfJoMCiPZKgdywCRblItIiKDpm1CB20T+n6ciMhgUhaJSLRQHkk0002qRURERERERETinAaIRERERERERETinAaIRERERERERETinAaIRERERERERETinAaIRERERERERETinAaIRERERERERETinAaIRERERERERETinAaIRERERERERETinAaIRERERERERETinAaIRERERERERETinAaIRERERERERETinAaIRERERERERETinAaIRERERERERETinPtEGhtj9gKNgB/wWWsXGGOygYeAKcBe4CPW2toTK1NE5OiURzJcUvYkkFDX9X3dyT5wB4atHhleyiIZLsoi6U5ZJMNJeRS7BuIKovOttadYaxd0fv8NYLm1thBY3vm9iMhQUB7JkErZnYDjg7YxXf9y1rjApwt045yySIaUskh6oSySIac8im0ndAVRL64EFnd+/TfgZeDrg/A6IiJ9UR7JoEjem0DWjgB1BXDz9U/y+cz9oXVTl36OscvdVJxvwbHDWKVEEWWRDAplkRwjZZEMGuXRyHCiw3gWeMEYs84Yc0PnsjxrbXnn1xVAXqSGxpgbjDFrjTFrvbSfYBkiIseXR92zyN/UPFS1SgxLKknA1Q7ll3fw+Y8/G3YABFB86V/IemEHBAyTntDZsjikLJIhoSySPgzI32nKI+kP5dHIcaJXEJ1jrd1vjBkDvGiM2dZ9pbXWGmMiDhFaa+8B7gFIN9kaRhSRE3VcedQ9ixKnTFAWSZ+SKy3NE2HPRff2+pjaf2Qx7XY/NV9qZtpvU9nzMTOEFcowUxbJkFAWSR8G5O805ZH0h/Jo5Dih4Ttr7f7O/yuBx4EzgIPGmHyAzv8rT7RIEZG+KI8kGty0fyH1gVZWznuUrO/v4+3T/4Xn2xUU/tU33KXJEFEWSTRQFomySKKF8ii2HPcAkTEm1Rgz6vDXwCXAJuAp4LrOh10HPHmiRYqIHI3ySIZKcnEC/mTDrz/6VwB+WTOd9227jA3twY9K35y7gk/veT/t1ssj05cB8FDRI7g27By2mmXoKItkqCiL5GiURTKUlEcjy4l8xCwPeNwYc/h5/mmtfd4YswZ42BjzWWAf8JETL1NE5KiURzLoksoSSDlouf3/3c3i5AB31E4hxengd9MfZrI7AYA5Ccn8cvLjJJq0Ya5WhomySAadskj6QVkkQ0J5NPIc9wCRtXYPMC/C8kPAhSdSlIjIsVAeyWAxLS5m/mgPAPWLp/GHX/yOUxITAfhcxjYcHFKc1LA20z3hB0AZTjJXrS3miffnsfXr2SRUeJi4rJ3dn9BNGkcaZZEMFmWRHAtlkQwm5dHINhjT3IuIiMQ+r8PMO6v51ZrgFfipToBJ7q4DnDQnqd9PdWHKDp6omYn7UB7jXvdhv13N1J/lUnyNbtAoIn1QFolItFAejXgaohMRETmS3zDr+3t5YPnfmZWQwqyElLADoGM13ZPGZ1euZfojTTzxl9+Rk9SMqz0wgAWLyIikLBKRaKE8igsaIBIREenOGvBYnlz/HFmulAF72g+lNfD0E/eR4SQHFziQvdrDuBd0Ma+IRKAsEpFooTyKGxogEhEROcxvmHHLO8z88nY8xjXgT3/4OR+etpymbzTQNtpQfq4l9zXPgL+WiMQwZZGIRAvlUVzR0JyIiEinGbds5Om9KwflAOhIK+c9CvNg2mM3DvpriUhsURaJSLRQHsUXXUEkIiLSycnMYF370L1etb8Z4zUEdJJMRLpRFolItFAexRcNEImIiHTa+tPJ/Og9V/BEc/Cmi34boNzX1O/25b4m/LZ/N1gs9zVx+nO3Mvptw6GF3uOqV0RGJmWRiEQL5VF80QCRiIhIN1u+P557Lnsvd9ROocm284XiD1HsDR4INQXaej0oKvY2cfPeq2gItPXrdW7eexV5r7ionm8HrHYRGTmURSISLZRH8UMDRCIiIt0Zy9avZvP89e/hx5Vncc+0x/jegUtZ1ebnrro5fLnkSkq6HQjt8Dazqs3PJ7d+io+PfYs0JzHs6Va3Rz4D9ljBiyRfX07WJoPToFsCisgRlEUiEi2UR3FDvS4iInIkx7L908m4rhzPmLdS+fH4pdxW+n4ADrWl8s2yy7l2zCoA/lB6KXsPZVOQW80PtlxG26wXyHQ1h57qwcrF/GPKyxFfZsWcJym84HpS16XQmD7oWyUisUZZJCLRQnkUFzRAJCIiEokDTaeMY+6qjwNQNLqSxwpe5I22APdXn83txe/lYP0oCnKrec+k3Xxn7Iv8Mf0sfrblvfj9wQt03zNpd68HQE80p/Htd6/EAo2zOoZoo0Qk5iiLRCRaKI9GPA0QiYiIROIOULLEYeLfUgEoGV3AxR9L4sVZT3P2hJU8n53IisZZfCprJTds+zhlo5P5Sd47JDo+WgIJAPw8bwMA9YFWTn/t8+w472+80RbgEytuIKHcQ94aP7VFbppm6CBIRHqhLBKRaKE8GvE0QCQiItKbhAClVwS/dNU5+B+dSMHULzD3jD08Ufgf3peygdPWXQfP5HD9+FvwJcPLH/0lE9xpoacoeOALGD9kbYWCsi/gbjGM3R6gJc9QekUA0AGQiPRBWSQi0UJ5NKJpgEhERKQf/Jk+mqZ4yNwGe0unM3vUTQAk1kFjUYDUEoe0Jst777oN2zkFhLGQedBi3VC10E/OWhfeNKi4wDd8GyIiMU1ZJCLRQnk08miASEREpJ982V4OLQJPlYeUAwaAxmkB/Bk+Gk4KPmbUlgScw5NzGDi0qGumjkOLAkNcsYiMRMoiEYkWyqORRQNEIiIix8ib66U+N/K6xtm6LFpEhoaySESihfJoZHCGuwARERERERERERleGiASEREREREREYlzGiASEREREREREYlzGiASEREREREREYlzGiASEREREREREYlzGiASEREREREREYlzGiASEREREREREYlzGiASEREREREREYlzGiASEREREREREYlzGiASEREREREREYlzGiASEREREREREYlzGiASEREREREREYlzGiASEREREREREYlzGiASEREREREREYlzGiASEREREREREYlzGiASEREREREREYlzGiASEREREREREYlzGiASEREREREREYlzGiASEREREREREYlzGiASEREREREREYlzGiASEREREREREYlzGiASEREREREREYlzfQ4QGWPuNcZUGmM2dVuWbYx50Rizs/P/rM7lxhjzO2PMLmPMO8aY+YNZvIjEF+WRiEQDZZGIRANlkYgMtP5cQXQf8L4jln0DWG6tLQSWd34PsAQo7Px3A3DXwJQpIgIoj0QkOtyHskhEht99KItEZAD1OUBkrX0VqDli8ZXA3zq//hvwgW7L77dBq4BMY0z+ANUqInFOeSQi0UBZJCLRQFkkIgPteO9BlGetLe/8ugLI6/x6PFDa7XFlnctERAaL8khEooGySESigbJIRI7bCd+k2lprAXus7YwxNxhj1hpj1nppP9EyRESOK4+6Z5G/qXmQKhOReKIsEpFoMBB/pymPROLL8Q4QHTx8SWLn/5Wdy/cDE7s9bkLnsh6stfdYaxdYaxd4SDzOMkRETiyPumeRKy110IsVkRFLWSQi0WBA/05THonEl+MdIHoKuK7z6+uAJ7st/1TnXfIXAvXdLnEUERkMyiMRiQbKIhGJBsoiETlu7r4eYIx5EFgMjDbGlAHfA34GPGyM+SywD/hI58OXApcCu4AW4NODULOIxCnlkYhEA2WRiEQDZZGIDLQ+B4istdf2surCCI+1wM0nWpSISCTKIxGJBsoiEYkGyiIRGWgnfJNqERERERERERGJbRogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhERERERERGJcxogEhER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\n",
169
- "text/plain": [
170
- "<Figure size 1440x1152 with 4 Axes>"
171
- ]
172
- },
173
- "metadata": {
174
- "needs_background": "light"
175
- },
176
- "output_type": "display_data"
177
- }
178
- ],
179
- "source": [
180
- "plt.figure(figsize=(20,16))\n",
181
- "for idx in range(state.shape[3]):\n",
182
- " plt.subplot(1,4,idx+1)\n",
183
- " plt.imshow(state[0][:,:,idx])\n",
184
- "plt.show()"
185
- ]
186
- },
187
- {
188
- "cell_type": "code",
189
- "execution_count": 18,
190
- "id": "df9fbb82",
191
- "metadata": {},
192
- "outputs": [],
193
- "source": [
194
- "#3. Train the RL Model"
195
- ]
196
- },
197
- {
198
- "cell_type": "code",
199
- "execution_count": 19,
200
- "id": "dfe85da1",
201
- "metadata": {},
202
- "outputs": [],
203
- "source": [
204
- "# Import os for file path management\n",
205
- "import os \n",
206
- "# Import PPO for algos\n",
207
- "from stable_baselines3 import PPO\n",
208
- "# Import Base Callback for saving models\n",
209
- "from stable_baselines3.common.callbacks import BaseCallback"
210
- ]
211
- },
212
- {
213
- "cell_type": "code",
214
- "execution_count": 20,
215
- "id": "59b4266d",
216
- "metadata": {},
217
- "outputs": [],
218
- "source": [
219
- "class TrainAndLoggingCallback(BaseCallback):\n",
220
- "\n",
221
- " def __init__(self, check_freq, save_path, verbose=1):\n",
222
- " super(TrainAndLoggingCallback, self).__init__(verbose)\n",
223
- " self.check_freq = check_freq\n",
224
- " self.save_path = save_path\n",
225
- "\n",
226
- " def _init_callback(self):\n",
227
- " if self.save_path is not None:\n",
228
- " os.makedirs(self.save_path, exist_ok=True)\n",
229
- "\n",
230
- " def _on_step(self):\n",
231
- " if self.n_calls % self.check_freq == 0:\n",
232
- " model_path = os.path.join(self.save_path, 'best_model_{}'.format(self.n_calls))\n",
233
- " self.model.save(model_path)\n",
234
- "\n",
235
- " return True"
236
- ]
237
- },
238
- {
239
- "cell_type": "code",
240
- "execution_count": 21,
241
- "id": "e72995ab",
242
- "metadata": {},
243
- "outputs": [],
244
- "source": [
245
- "CHECKPOINT_DIR = './veriler/mario/train/'\n",
246
- "LOG_DIR = './veriler/mario/logs/'"
247
- ]
248
- },
249
- {
250
- "cell_type": "code",
251
- "execution_count": 22,
252
- "id": "cfce808d",
253
- "metadata": {},
254
- "outputs": [],
255
- "source": [
256
- "# Setup model saving callback\n",
257
- "callback = TrainAndLoggingCallback(check_freq=10000, save_path=CHECKPOINT_DIR)"
258
- ]
259
- },
260
- {
261
- "cell_type": "code",
262
- "execution_count": 23,
263
- "id": "1d1b0bc0",
264
- "metadata": {},
265
- "outputs": [
266
- {
267
- "name": "stdout",
268
- "output_type": "stream",
269
- "text": [
270
- "Using cuda device\n",
271
- "Wrapping the env in a VecTransposeImage.\n"
272
- ]
273
- }
274
- ],
275
- "source": [
276
- "# This is the AI model started\n",
277
- "model = PPO('CnnPolicy', env, verbose=1, tensorboard_log=LOG_DIR, learning_rate=0.000001, \n",
278
- " n_steps=512) "
279
- ]
280
- },
281
- {
282
- "cell_type": "code",
283
- "execution_count": 28,
284
- "id": "3ec8f6f6",
285
- "metadata": {},
286
- "outputs": [
287
- {
288
- "ename": "AttributeError",
289
- "evalue": "'NoneType' object has no attribute 'reset'",
290
- "output_type": "error",
291
- "traceback": [
292
- "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
293
- "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
294
- "Input \u001b[1;32mIn [28]\u001b[0m, in \u001b[0;36m<cell line: 2>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;66;03m# Train the AI model, this is where the AI model starts to learn\u001b[39;00m\n\u001b[1;32m----> 2\u001b[0m \u001b[43mmodel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlearn\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtotal_timesteps\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m1000000\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallback\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcallback\u001b[49m\u001b[43m)\u001b[49m\n",
295
- "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages\\stable_baselines3\\ppo\\ppo.py:299\u001b[0m, in \u001b[0;36mPPO.learn\u001b[1;34m(self, total_timesteps, callback, log_interval, eval_env, eval_freq, n_eval_episodes, tb_log_name, eval_log_path, reset_num_timesteps)\u001b[0m\n\u001b[0;32m 286\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mlearn\u001b[39m(\n\u001b[0;32m 287\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[0;32m 288\u001b[0m total_timesteps: \u001b[38;5;28mint\u001b[39m,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 296\u001b[0m reset_num_timesteps: \u001b[38;5;28mbool\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m,\n\u001b[0;32m 297\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPPO\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m--> 299\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mPPO\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlearn\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 300\u001b[0m \u001b[43m \u001b[49m\u001b[43mtotal_timesteps\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtotal_timesteps\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 301\u001b[0m \u001b[43m \u001b[49m\u001b[43mcallback\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcallback\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 302\u001b[0m \u001b[43m \u001b[49m\u001b[43mlog_interval\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlog_interval\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 303\u001b[0m \u001b[43m \u001b[49m\u001b[43meval_env\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43meval_env\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 304\u001b[0m \u001b[43m \u001b[49m\u001b[43meval_freq\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43meval_freq\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 305\u001b[0m \u001b[43m \u001b[49m\u001b[43mn_eval_episodes\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mn_eval_episodes\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 306\u001b[0m \u001b[43m \u001b[49m\u001b[43mtb_log_name\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtb_log_name\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 307\u001b[0m \u001b[43m \u001b[49m\u001b[43meval_log_path\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43meval_log_path\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 308\u001b[0m \u001b[43m \u001b[49m\u001b[43mreset_num_timesteps\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mreset_num_timesteps\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 309\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n",
296
- "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages\\stable_baselines3\\common\\on_policy_algorithm.py:242\u001b[0m, in \u001b[0;36mOnPolicyAlgorithm.learn\u001b[1;34m(self, total_timesteps, callback, log_interval, eval_env, eval_freq, n_eval_episodes, tb_log_name, eval_log_path, reset_num_timesteps)\u001b[0m\n\u001b[0;32m 228\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mlearn\u001b[39m(\n\u001b[0;32m 229\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[0;32m 230\u001b[0m total_timesteps: \u001b[38;5;28mint\u001b[39m,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 238\u001b[0m reset_num_timesteps: \u001b[38;5;28mbool\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m,\n\u001b[0;32m 239\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mOnPolicyAlgorithm\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[0;32m 240\u001b[0m iteration \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m\n\u001b[1;32m--> 242\u001b[0m total_timesteps, callback \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_setup_learn\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 243\u001b[0m \u001b[43m \u001b[49m\u001b[43mtotal_timesteps\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43meval_env\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallback\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43meval_freq\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mn_eval_episodes\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43meval_log_path\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mreset_num_timesteps\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtb_log_name\u001b[49m\n\u001b[0;32m 244\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 246\u001b[0m callback\u001b[38;5;241m.\u001b[39mon_training_start(\u001b[38;5;28mlocals\u001b[39m(), \u001b[38;5;28mglobals\u001b[39m())\n\u001b[0;32m 248\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mnum_timesteps \u001b[38;5;241m<\u001b[39m total_timesteps:\n",
297
- "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages\\stable_baselines3\\common\\base_class.py:429\u001b[0m, in \u001b[0;36mBaseAlgorithm._setup_learn\u001b[1;34m(self, total_timesteps, eval_env, callback, eval_freq, n_eval_episodes, log_path, reset_num_timesteps, tb_log_name)\u001b[0m\n\u001b[0;32m 427\u001b[0m \u001b[38;5;66;03m# Avoid resetting the environment when calling ``.learn()`` consecutive times\u001b[39;00m\n\u001b[0;32m 428\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m reset_num_timesteps \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_last_obs \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m--> 429\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_last_obs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43menv\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mreset\u001b[49m() \u001b[38;5;66;03m# pytype: disable=annotation-type-mismatch\u001b[39;00m\n\u001b[0;32m 430\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_last_episode_starts \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mones((\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39menv\u001b[38;5;241m.\u001b[39mnum_envs,), dtype\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mbool\u001b[39m)\n\u001b[0;32m 431\u001b[0m \u001b[38;5;66;03m# Retrieve unnormalized observation for saving into the buffer\u001b[39;00m\n",
298
- "\u001b[1;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'reset'"
299
- ]
300
- }
301
- ],
302
- "source": [
303
- "# Train the AI model, this is where the AI model starts to learn\n",
304
- "model.learn(total_timesteps=1000000, callback=callback)"
305
- ]
306
- },
307
- {
308
- "cell_type": "code",
309
- "execution_count": null,
310
- "id": "84f6a917",
311
- "metadata": {},
312
- "outputs": [],
313
- "source": [
314
- "model.save('thisisatestmodel')"
315
- ]
316
- },
317
- {
318
- "cell_type": "code",
319
- "execution_count": null,
320
- "id": "7ddb74c9",
321
- "metadata": {},
322
- "outputs": [],
323
- "source": [
324
- "#4. Test it Out"
325
- ]
326
- },
327
- {
328
- "cell_type": "code",
329
- "execution_count": 25,
330
- "id": "052cc42e",
331
- "metadata": {},
332
- "outputs": [],
333
- "source": [
334
- "# Load model\n",
335
- "model = PPO.load('./veriler/mario/train/best_model_40000')"
336
- ]
337
- },
338
- {
339
- "cell_type": "code",
340
- "execution_count": 27,
341
- "id": "7b774bc9",
342
- "metadata": {},
343
- "outputs": [],
344
- "source": [
345
- "state = env.reset()"
346
- ]
347
- },
348
- {
349
- "cell_type": "code",
350
- "execution_count": null,
351
- "id": "455c4e0b",
352
- "metadata": {},
353
- "outputs": [
354
- {
355
- "name": "stderr",
356
- "output_type": "stream",
357
- "text": [
358
- "C:\\Users\\dogru\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages\\pyglet\\image\\codecs\\wic.py:289: UserWarning: [WinError -2147417850] İş parçacığı modu kurulduktan sonra değiştirilemez\n",
359
- " warnings.warn(str(err))\n"
360
- ]
361
- }
362
- ],
363
- "source": [
364
- "# Start the game \n",
365
- "state = env.reset()\n",
366
- "# Loop through the game\n",
367
- "while True: \n",
368
- " action, _ = model.predict(state)\n",
369
- " state, reward, done, info = env.step(action)\n",
370
- " env.render()"
371
- ]
372
- },
373
- {
374
- "cell_type": "code",
375
- "execution_count": null,
376
- "id": "7203c8b3",
377
- "metadata": {},
378
- "outputs": [],
379
- "source": []
380
- },
381
- {
382
- "cell_type": "code",
383
- "execution_count": null,
384
- "id": "e5460da3",
385
- "metadata": {},
386
- "outputs": [],
387
- "source": []
388
- },
389
- {
390
- "cell_type": "code",
391
- "execution_count": null,
392
- "id": "4061af41",
393
- "metadata": {},
394
- "outputs": [],
395
- "source": []
396
- }
397
- ],
398
- "metadata": {
399
- "kernelspec": {
400
- "display_name": "Python 3 (ipykernel)",
401
- "language": "python",
402
- "name": "python3"
403
- },
404
- "language_info": {
405
- "codemirror_mode": {
406
- "name": "ipython",
407
- "version": 3
408
- },
409
- "file_extension": ".py",
410
- "mimetype": "text/x-python",
411
- "name": "python",
412
- "nbconvert_exporter": "python",
413
- "pygments_lexer": "ipython3",
414
- "version": "3.10.3"
415
- }
416
- },
417
- "nbformat": 4,
418
- "nbformat_minor": 5
419
- }