Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save lmclupr/b35c89b2f8f81b443166e88b787b03ab to your computer and use it in GitHub Desktop.
Save lmclupr/b35c89b2f8f81b443166e88b787b03ab to your computer and use it in GitHub Desktop.
Python notebook for the Box2D Race car reinforce learning problem.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Deep-Q Learning using Simple Feedfoward Neural Network\n",
"\n",
"The solution crops the output pixel matrix to isolate the racing car and track for one, and isolates the sensor readers in second place. The top part (track and car) and quantized to b/w and flatten out to a 1D vector. The bottom part, i.e. the sensors output (steering, g, speed, abs) is analysed and the various sensors output and numerized. A single feature vector is created by merging the two parts into one. This approach is less fancy than using a CONV NN merged with a FFNN, but requies less process power and less episodes to get to a certain learning plateau.\n",
"\n",
"As for the output of the nn, we have descrtized it into 9 possible actions: 7 steering (neutral, 3 right, 3 left) and 2 power, 50% brake or 33% gaz. i.e. this means that the car cannot steer and power on at the same time. Nor can it apply brake and gaz at the same time. This reduces significantly the solution space. \n",
"\n",
"Enjoy,\n",
"\n",
"Luc Prieur"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Using TensorFlow backend.\n"
]
}
],
"source": [
"import gym\n",
"import os\n",
"import sys\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from gym import wrappers\n",
"from datetime import datetime\n",
"import random\n",
"from sklearn.preprocessing import StandardScaler\n",
"from keras.models import Sequential\n",
"from keras.layers import Dense, Dropout, Activation\n",
"from keras.layers import Embedding\n",
"from keras.optimizers import SGD, RMSprop, Adam, Adamax\n",
"from keras.layers import Dense, Dropout, Activation, Flatten\n",
"from keras.layers import Convolution2D, MaxPooling2D\n",
"from keras.layers import Merge\n",
"from keras.utils import np_utils\n",
"from keras.models import load_model\n",
"import cv2"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def plot_running_avg(totalrewards):\n",
" N = len(totalrewards)\n",
" running_avg = np.empty(N)\n",
" for t in range(N):\n",
" running_avg[t] = totalrewards[max(0, t-100):(t+1)].mean()\n",
" plt.plot(running_avg)\n",
" plt.title(\"Running Average\")\n",
" plt.show()"
]
},
{
"cell_type": "raw",
"metadata": {},
"source": [
"gym.envs.register(\n",
" id='CarRacing-custom-v0',\n",
" entry_point='gym.envs.box2d:CarRacing',\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"[2017-08-30 12:45:02,904] Making new env: CarRacing-v0\n"
]
}
],
"source": [
"env = gym.make('CarRacing-v0')"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"[2017-08-30 12:45:03,105] Clearing 15 monitor files from previous run (because force=True was provided)\n"
]
}
],
"source": [
"env = wrappers.Monitor(env, 'monitor-folder', force=True)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def transform(s):\n",
"# cv2.imshow('original', s)\n",
"# cv2.waitKey(1)\n",
"\n",
" # crop_img = img[200:400, 100:300] # Crop from x, y, w, h -> 100, 200, 300, 400\n",
" # NOTE: its img[y: y + h, x: x + w] and *not* img[x: x + w, y: y + h]\n",
" # bottom_black_bar is the section of the screen with steering, speed, abs and gyro information.\n",
" # we crop off the digits on the right as they are illigible, even for ml.\n",
" # since color is irrelavent, we grayscale it.\n",
" bottom_black_bar = s[84:, 12:]\n",
" img = cv2.cvtColor(bottom_black_bar, cv2.COLOR_RGB2GRAY)\n",
" bottom_black_bar_bw = cv2.threshold(img, 1, 255, cv2.THRESH_BINARY)[1]\n",
" bottom_black_bar_bw = cv2.resize(bottom_black_bar_bw, (84, 12), interpolation = cv2.INTER_NEAREST)\n",
" \n",
" # upper_field = observation[:84, :96] # this is the section of the screen that contains the track.\n",
" upper_field = s[:84, 6:90] # we crop side of screen as they carry little information\n",
" img = cv2.cvtColor(upper_field, cv2.COLOR_RGB2GRAY)\n",
" upper_field_bw = cv2.threshold(img, 120, 255, cv2.THRESH_BINARY)[1]\n",
" upper_field_bw = cv2.resize(upper_field_bw, (10, 10), interpolation = cv2.INTER_NEAREST) # re scaled to 7x7 pixels\n",
"# cv2.imshow('video', upper_field_bw)\n",
"# cv2.waitKey(1)\n",
" upper_field_bw = upper_field_bw.astype('float')/255\n",
" \n",
" car_field = s[66:78, 43:53]\n",
" img = cv2.cvtColor(car_field, cv2.COLOR_RGB2GRAY)\n",
" car_field_bw = cv2.threshold(img, 80, 255, cv2.THRESH_BINARY)[1]\n",
"\n",
"# print(car_field_bw[:, 3].mean()/255, car_field_bw[:, 4].mean()/255, car_field_bw[:, 5].mean()/255, car_field_bw[:, 6].mean()/255)\n",
" car_field_t = [car_field_bw[:, 3].mean()/255, car_field_bw[:, 4].mean()/255, car_field_bw[:, 5].mean()/255, car_field_bw[:, 6].mean()/255]\n",
" \n",
"# rotated_image = rotateImage(car_field_bw, 45)\n",
"# cv2.imshow('video rotated', rotated_image)\n",
"# cv2.waitKey(1)\n",
"\n",
" return bottom_black_bar_bw, upper_field_bw, car_field_t"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# this function uses the bottom black bar of the screen and extracts steering setting, speed and gyro data\n",
"def compute_steering_speed_gyro_abs(a):\n",
" right_steering = a[6, 36:46].mean()/255\n",
" left_steering = a[6, 26:36].mean()/255\n",
" steering = (right_steering - left_steering + 1.0)/2\n",
" \n",
" left_gyro = a[6, 46:60].mean()/255\n",
" right_gyro = a[6, 60:76].mean()/255\n",
" gyro = (right_gyro - left_gyro + 1.0)/2\n",
" \n",
" speed = a[:, 0][:-2].mean()/255\n",
" abs1 = a[:, 6][:-2].mean()/255\n",
" abs2 = a[:, 8][:-2].mean()/255\n",
" abs3 = a[:, 10][:-2].mean()/255\n",
" abs4 = a[:, 12][:-2].mean()/255\n",
" \n",
"# white = np.ones((round(speed * 100), 10))\n",
"# black = np.zeros((round(100 - speed * 100), 10))\n",
"# speed_display = np.concatenate((black, white))*255\n",
" \n",
"# cv2.imshow('sensors', speed_display)\n",
"# cv2.waitKey(1)\n",
"\n",
" \n",
" return [steering, speed, gyro, abs1, abs2, abs3, abs4]"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"vector_size = 10*10 + 7 + 4"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"def create_nn():\n",
" if os.path.exists('race-car.h5'):\n",
" return load_model('race-car.h5')\n",
" \n",
" model = Sequential()\n",
" model.add(Dense(512, init='lecun_uniform', input_shape=(vector_size,)))# 7x7 + 3. or 14x14 + 3\n",
" model.add(Activation('relu'))\n",
"\n",
"# model.add(Dense(512, init='lecun_uniform'))\n",
"# model.add(Activation('relu'))\n",
"# model.add(Dropout(0.3))\n",
"\n",
" model.add(Dense(11, init='lecun_uniform'))\n",
" model.add(Activation('linear')) #linear output so we can have range of real-valued outputs\n",
"\n",
"# rms = RMSprop(lr=0.005)\n",
"# sgd = SGD(lr=0.1, decay=0.0, momentum=0.0, nesterov=False)\n",
"# try \"adam\"\n",
"# adam = Adam(lr=0.0005)\n",
" adamax = Adamax() #Adamax(lr=0.001)\n",
" model.compile(loss='mse', optimizer=adamax)\n",
" model.summary()\n",
" \n",
" return model"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"class Model:\n",
" def __init__(self, env):\n",
" self.env = env\n",
" self.model = create_nn() # one feedforward nn for all actions.\n",
"\n",
" def predict(self, s):\n",
" return self.model.predict(s.reshape(-1, vector_size), verbose=0)[0]\n",
"\n",
" def update(self, s, G):\n",
" self.model.fit(s.reshape(-1, vector_size), np.array(G).reshape(-1, 11), nb_epoch=1, verbose=0)\n",
"\n",
" def sample_action(self, s, eps):\n",
" qval = self.predict(s)\n",
" if np.random.random() < eps:\n",
" return random.randint(0, 10), qval\n",
" else:\n",
" return np.argmax(qval), qval"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"def convert_argmax_qval_to_env_action(output_value):\n",
" # we reduce the action space to 15 values. 9 for steering, 6 for gaz/brake.\n",
" # to reduce the action space, gaz and brake cannot be applied at the same time.\n",
" # as well, steering input and gaz/brake cannot be applied at the same time.\n",
" # similarly to real life drive, you brake/accelerate in straight line, you coast while sterring.\n",
" \n",
" gaz = 0.0\n",
" brake = 0.0\n",
" steering = 0.0\n",
" \n",
" # output value ranges from 0 to 10\n",
" \n",
" if output_value <= 8:\n",
" # steering. brake and gaz are zero.\n",
" output_value -= 4\n",
" steering = float(output_value)/4\n",
" elif output_value >= 9 and output_value <= 9:\n",
" output_value -= 8\n",
" gaz = float(output_value)/3 # 33% \n",
" elif output_value >= 10 and output_value <= 10:\n",
" output_value -= 9\n",
" brake = float(output_value)/2 # 50% brakes\n",
" else:\n",
" print(\"error\")\n",
" \n",
" white = np.ones((round(brake * 100), 10))\n",
" black = np.zeros((round(100 - brake * 100), 10))\n",
" brake_display = np.concatenate((black, white))*255 \n",
" \n",
" white = np.ones((round(gaz * 100), 10))\n",
" black = np.zeros((round(100 - gaz * 100), 10))\n",
" gaz_display = np.concatenate((black, white))*255\n",
" \n",
" control_display = np.concatenate((brake_display, gaz_display), axis=1)\n",
"\n",
" cv2.imshow('controls', control_display)\n",
" cv2.waitKey(1)\n",
" \n",
" return [steering, gaz, brake]"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"def play_one(env, model, eps, gamma):\n",
" observation = env.reset()\n",
" done = False\n",
" full_reward_received = False\n",
" totalreward = 0\n",
" iters = 0\n",
" while not done:\n",
" a, b, c = transform(observation)\n",
" state = np.concatenate((np.array([compute_steering_speed_gyro_abs(a)]).reshape(1,-1).flatten(), b.reshape(1,-1).flatten(), c), axis=0) # this is 3 + 7*7 size vector. all scaled in range 0..1 \n",
" argmax_qval, qval = model.sample_action(state, eps)\n",
" prev_state = state\n",
" action = convert_argmax_qval_to_env_action(argmax_qval)\n",
" observation, reward, done, info = env.step(action)\n",
"\n",
" a, b, c = transform(observation) \n",
" state = np.concatenate((np.array([compute_steering_speed_gyro_abs(a)]).reshape(1,-1).flatten(), b.reshape(1,-1).flatten(), c), axis=0) # this is 3 + 7*7 size vector. all scaled in range 0..1 \n",
" \n",
" # update the model\n",
" # standard Q learning TD(0)\n",
" next_qval = model.predict(state)\n",
" G = reward + gamma*np.max(next_qval)\n",
" y = qval[:]\n",
" y[argmax_qval] = G\n",
" model.update(prev_state, y)\n",
" totalreward += reward\n",
" iters += 1\n",
" \n",
" if iters > 1500:\n",
" print(\"This episode is stuck\")\n",
" break\n",
" \n",
" return totalreward, iters\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Track generation: 1262..1590 -> 328-tiles track\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"[2017-08-30 12:45:06,781] Starting new video recorder writing to C:\\Users\\lucpr\\Documents\\nn\\rl\\monitor-folder\\openaigym.video.0.12248.video000000.mp4\n",
"[2017-08-30 12:46:13,405] Starting new video recorder writing to C:\\Users\\lucpr\\Documents\\nn\\rl\\monitor-folder\\openaigym.video.0.12248.video000001.mp4\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"episode: 0 iters 1000 total reward: 34.55657492355014 eps: 0.0166574151163 avg reward (last 100): 34.5565749236\n",
"Track generation: 1191..1493 -> 302-tiles track\n",
"episode: 1 iters 1000 total reward: 232.22591362126767 eps: 0.0166481789553 avg reward (last 100): 133.391244272\n",
"Track generation: 1148..1438 -> 290-tiles track\n",
"retry to generate track (normal if there are not many of this messages)\n",
"Track generation: 1271..1594 -> 323-tiles track\n",
"episode: 2 iters 1000 total reward: 182.60869565217476 eps: 0.016638958141 avg reward (last 100): 149.797061399\n",
"Track generation: 1384..1734 -> 350-tiles track\n",
"episode: 3 iters 1000 total reward: 172.20630372493304 eps: 0.0166297526309 avg reward (last 100): 155.39937198\n",
"Track generation: 1067..1340 -> 273-tiles track\n",
"retry to generate track (normal if there are not many of this messages)\n",
"Track generation: 1183..1483 -> 300-tiles track\n",
"episode: 4 iters 1000 total reward: 308.0267558528279 eps: 0.0166205623829 avg reward (last 100): 185.924848755\n",
"Track generation: 1008..1264 -> 256-tiles track\n",
"episode: 5 iters 1000 total reward: 366.66666666665054 eps: 0.0166113873546 avg reward (last 100): 216.048485074\n",
"Track generation: 1051..1327 -> 276-tiles track\n",
"episode: 6 iters 1000 total reward: 85.45454545455041 eps: 0.0166022275043 avg reward (last 100): 197.392207985\n",
"Track generation: 1076..1356 -> 280-tiles track\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"[2017-08-30 12:50:17,243] Starting new video recorder writing to C:\\Users\\lucpr\\Documents\\nn\\rl\\monitor-folder\\openaigym.video.0.12248.video000008.mp4\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"episode: 7 iters 1000 total reward: 32.61648745519621 eps: 0.01659308279 avg reward (last 100): 176.795242919\n",
"Track generation: 1100..1379 -> 279-tiles track\n",
"episode: 8 iters 1000 total reward: 439.5683453237243 eps: 0.0165839531702 avg reward (last 100): 205.992254297\n",
"Track generation: 1175..1472 -> 297-tiles track\n",
"episode: 9 iters 1000 total reward: 349.324324324327 eps: 0.0165748386033 avg reward (last 100): 220.3254613\n",
"Track generation: 1121..1405 -> 284-tiles track\n",
"episode: 10 iters 1000 total reward: 670.3180212013995 eps: 0.0165657390481 avg reward (last 100): 261.233875836\n",
"Track generation: 1191..1493 -> 302-tiles track\n",
"episode: 11 iters 1000 total reward: 255.48172757474578 eps: 0.0165566544633 avg reward (last 100): 260.754530148\n",
"Track generation: 1183..1483 -> 300-tiles track\n",
"episode: 12 iters 1000 total reward: 465.2173913043428 eps: 0.016547584808 avg reward (last 100): 276.482442545\n",
"Track generation: 1054..1321 -> 267-tiles track\n",
"episode: 13 iters 1000 total reward: 257.1428571428441 eps: 0.0165385300414 avg reward (last 100): 275.101043587\n",
"Track generation: 1037..1308 -> 271-tiles track\n",
"episode: 14 iters 1000 total reward: 311.1111111111131 eps: 0.0165294901227 avg reward (last 100): 277.501714756\n",
"Track generation: 980..1229 -> 249-tiles track\n",
"episode: 15 iters 1000 total reward: 190.32258064516427 eps: 0.0165204650114 avg reward (last 100): 272.053018874\n",
"Track generation: 1235..1548 -> 313-tiles track\n",
"episode: 16 iters 1000 total reward: 307.05128205127266 eps: 0.0165114546671 avg reward (last 100): 274.111740237\n",
"Track generation: 1127..1413 -> 286-tiles track\n",
"episode: 17 iters 1000 total reward: 303.50877192980863 eps: 0.0165024590496 avg reward (last 100): 275.744908664\n",
"Track generation: 1122..1406 -> 284-tiles track\n",
"episode: 18 iters 1000 total reward: 719.787985865709 eps: 0.0164934781189 avg reward (last 100): 299.115596938\n",
"Track generation: 1061..1330 -> 269-tiles track\n",
"episode: 19 iters 1000 total reward: 355.2238805969982 eps: 0.0164845118349 avg reward (last 100): 301.921011121\n",
"Track generation: 1043..1308 -> 265-tiles track\n",
"episode: 20 iters 1000 total reward: 320.45454545452964 eps: 0.016475560158 avg reward (last 100): 302.803560375\n",
"Track generation: 1145..1435 -> 290-tiles track\n",
"episode: 21 iters 1000 total reward: 391.34948096884375 eps: 0.0164666230485 avg reward (last 100): 306.828374948\n",
"Track generation: 1147..1438 -> 291-tiles track\n",
"episode: 22 iters 1000 total reward: 382.75862068964545 eps: 0.0164577004669 avg reward (last 100): 310.12968998\n",
"Track generation: 1164..1459 -> 295-tiles track\n",
"episode: 23 iters 1000 total reward: 522.4489795918266 eps: 0.016448792374 avg reward (last 100): 318.976327047\n",
"Track generation: 918..1159 -> 241-tiles track\n",
"episode: 24 iters 1000 total reward: 83.3333333333384 eps: 0.0164398987305 avg reward (last 100): 309.550607298\n",
"Track generation: 1102..1388 -> 286-tiles track\n",
"episode: 25 iters 1000 total reward: 247.36842105263563 eps: 0.0164310194975 avg reward (last 100): 307.158984751\n",
"Track generation: 1172..1469 -> 297-tiles track\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"[2017-08-30 13:00:51,352] Starting new video recorder writing to C:\\Users\\lucpr\\Documents\\nn\\rl\\monitor-folder\\openaigym.video.0.12248.video000027.mp4\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"episode: 26 iters 1000 total reward: 481.08108108107143 eps: 0.0164221546361 avg reward (last 100): 313.600543874\n",
"Track generation: 1115..1412 -> 297-tiles track\n",
"retry to generate track (normal if there are not many of this messages)\n",
"Track generation: 1071..1343 -> 272-tiles track\n",
"episode: 27 iters 1000 total reward: 483.0258302582919 eps: 0.0164133041075 avg reward (last 100): 319.651446959\n",
"Track generation: 1155..1448 -> 293-tiles track\n",
"episode: 28 iters 1000 total reward: 533.5616438356016 eps: 0.0164044678731 avg reward (last 100): 327.027660644\n",
"Track generation: 1295..1623 -> 328-tiles track\n",
"episode: 29 iters 1000 total reward: 169.1131498470986 eps: 0.0163956458946 avg reward (last 100): 321.763843618\n",
"Track generation: 1001..1261 -> 260-tiles track\n",
"episode: 30 iters 1000 total reward: 347.8764478764433 eps: 0.0163868381336 avg reward (last 100): 322.606185691\n",
"Track generation: 1256..1581 -> 325-tiles track\n",
"episode: 31 iters 1000 total reward: 412.34567901234556 eps: 0.016378044552 avg reward (last 100): 325.410544857\n",
"Track generation: 1276..1599 -> 323-tiles track\n",
"episode: 32 iters 1000 total reward: 465.2173913043311 eps: 0.0163692651118 avg reward (last 100): 329.647115961\n",
"Track generation: 1260..1537 -> 277-tiles track\n",
"retry to generate track (normal if there are not many of this messages)\n",
"Track generation: 1009..1272 -> 263-tiles track\n",
"episode: 33 iters 1000 total reward: 335.11450381679396 eps: 0.0163604997751 avg reward (last 100): 329.807921487\n",
"Track generation: 1120..1408 -> 288-tiles track\n",
"retry to generate track (normal if there are not many of this messages)\n",
"Track generation: 1221..1530 -> 309-tiles track\n",
"episode: 34 iters 1000 total reward: 218.18181818182256 eps: 0.0163517485042 avg reward (last 100): 326.618604249\n",
"Track generation: 1105..1385 -> 280-tiles track\n",
"episode: 35 iters 1000 total reward: 283.51254480285263 eps: 0.0163430112615 avg reward (last 100): 325.421213709\n",
"Track generation: 1271..1593 -> 322-tiles track\n",
"episode: 36 iters 1000 total reward: 223.98753894080977 eps: 0.0163342880096 avg reward (last 100): 322.67976304\n",
"Track generation: 1149..1440 -> 291-tiles track\n",
"episode: 37 iters 1000 total reward: 189.65517241379715 eps: 0.0163255787112 avg reward (last 100): 319.179115918\n",
"Track generation: 1120..1404 -> 284-tiles track\n",
"episode: 38 iters 1000 total reward: 511.30742049468563 eps: 0.0163168833291 avg reward (last 100): 324.105482702\n",
"Track generation: 1222..1531 -> 309-tiles track\n",
"episode: 39 iters 1000 total reward: 188.96103896104364 eps: 0.0163082018263 avg reward (last 100): 320.726871609\n",
"Track generation: 1437..1800 -> 363-tiles track\n",
"episode: 40 iters 1000 total reward: 187.29281767956337 eps: 0.016299534166 avg reward (last 100): 317.472382488\n",
"Track generation: 1391..1743 -> 352-tiles track\n",
"episode: 41 iters 1000 total reward: 159.25925925926387 eps: 0.0162908803113 avg reward (last 100): 313.705403364\n",
"Track generation: 1190..1492 -> 302-tiles track\n",
"episode: 42 iters 1000 total reward: 175.74750830565304 eps: 0.0162822402256 avg reward (last 100): 310.497080223\n",
"Track generation: 1193..1495 -> 302-tiles track\n",
"episode: 43 iters 1000 total reward: 461.46179401991685 eps: 0.0162736138726 avg reward (last 100): 313.928096446\n",
"Track generation: 1212..1519 -> 307-tiles track\n",
"episode: 44 iters 1000 total reward: 677.777777777765 eps: 0.0162650012158 avg reward (last 100): 322.01364492\n",
"Track generation: 996..1253 -> 257-tiles track\n",
"retry to generate track (normal if there are not many of this messages)\n",
"Track generation: 1091..1368 -> 277-tiles track\n",
"episode: 45 iters 1000 total reward: 381.8840579709998 eps: 0.0162564022191 avg reward (last 100): 323.315175638\n",
"Track generation: 1051..1324 -> 273-tiles track\n",
"episode: 46 iters 1000 total reward: 271.3235294117657 eps: 0.0162478168463 avg reward (last 100): 322.208970399\n",
"Track generation: 1140..1429 -> 289-tiles track\n",
"episode: 47 iters 1000 total reward: 448.61111111110506 eps: 0.0162392450615 avg reward (last 100): 324.842348331\n",
"Track generation: 1031..1299 -> 268-tiles track\n",
"episode: 48 iters 1000 total reward: 338.2022471910108 eps: 0.016230686829 avg reward (last 100): 325.114999328\n",
"Track generation: 1199..1503 -> 304-tiles track\n",
"episode: 49 iters 1000 total reward: 589.768976897684 eps: 0.0162221421131 avg reward (last 100): 330.408078879\n",
"Track generation: 1159..1453 -> 294-tiles track\n",
"episode: 50 iters 1000 total reward: 746.4163822525405 eps: 0.0162136108781 avg reward (last 100): 338.565104436\n",
"Track generation: 1118..1401 -> 283-tiles track\n",
"episode: 51 iters 1000 total reward: 293.6170212765808 eps: 0.0162050930888 avg reward (last 100): 337.700718221\n",
"Track generation: 1072..1344 -> 272-tiles track\n",
"episode: 52 iters 1000 total reward: 530.9963099630864 eps: 0.0161965887098 avg reward (last 100): 341.347804858\n",
"Track generation: 1152..1444 -> 292-tiles track\n",
"episode: 53 iters 1000 total reward: 260.82474226802736 eps: 0.016188097706 avg reward (last 100): 339.856637032\n",
"Track generation: 1130..1423 -> 293-tiles track\n",
"episode: 54 iters 1000 total reward: 358.9041095890418 eps: 0.0161796200423 avg reward (last 100): 340.202954715\n",
"Track generation: 1219..1528 -> 309-tiles track\n",
"episode: 55 iters 1000 total reward: 257.14285714284347 eps: 0.0161711556838 avg reward (last 100): 338.719738687\n",
"Track generation: 1323..1658 -> 335-tiles track\n",
"episode: 56 iters 1000 total reward: 465.86826347304566 eps: 0.0161627045959 avg reward (last 100): 340.95041456\n",
"Track generation: 1171..1468 -> 297-tiles track\n",
"episode: 57 iters 1000 total reward: 180.4054054054092 eps: 0.0161542667438 avg reward (last 100): 338.182397161\n",
"Track generation: 1317..1650 -> 333-tiles track\n",
"episode: 58 iters 1000 total reward: 267.469879518058 eps: 0.016145842093 avg reward (last 100): 336.983879913\n",
"Track generation: 1110..1392 -> 282-tiles track\n",
"episode: 59 iters 1000 total reward: 230.96085409252436 eps: 0.0161374306092 avg reward (last 100): 335.216829482\n",
"Track generation: 1128..1414 -> 286-tiles track\n",
"episode: 60 iters 1000 total reward: 342.10526315788746 eps: 0.0161290322581 avg reward (last 100): 335.329754625\n",
"Track generation: 1176..1474 -> 298-tiles track\n",
"episode: 61 iters 1000 total reward: 479.12457912456244 eps: 0.0161206470055 avg reward (last 100): 337.649025988\n",
"Track generation: 1219..1528 -> 309-tiles track\n",
"episode: 62 iters 1000 total reward: 162.98701298701764 eps: 0.0161122748174 avg reward (last 100): 334.876613083\n",
"Track generation: 1292..1619 -> 327-tiles track\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"[2017-08-30 13:21:13,059] Starting new video recorder writing to C:\\Users\\lucpr\\Documents\\nn\\rl\\monitor-folder\\openaigym.video.0.12248.video000064.mp4\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"episode: 63 iters 1000 total reward: 424.53987730060754 eps: 0.01610391566 avg reward (last 100): 336.277601586\n",
"Track generation: 1187..1488 -> 301-tiles track\n",
"episode: 64 iters 1000 total reward: 539.999999999983 eps: 0.0160955694995 avg reward (last 100): 339.411792331\n",
"Track generation: 1076..1349 -> 273-tiles track\n",
"episode: 65 iters 1000 total reward: 403.6764705882202 eps: 0.0160872363022 avg reward (last 100): 340.385499577\n",
"Track generation: 1370..1724 -> 354-tiles track\n",
"episode: 66 iters 1000 total reward: 208.78186968838875 eps: 0.0160789160346 avg reward (last 100): 338.421266295\n",
"Track generation: 1111..1393 -> 282-tiles track\n",
"episode: 67 iters 1000 total reward: 213.1672597864786 eps: 0.0160706086633 avg reward (last 100): 336.579295611\n",
"Track generation: 1073..1345 -> 272-tiles track\n",
"episode: 68 iters 1000 total reward: 446.1254612545974 eps: 0.0160623141551 avg reward (last 100): 338.1669212\n",
"Track generation: 1253..1570 -> 317-tiles track\n",
"episode: 69 iters 1000 total reward: 399.99999999998636 eps: 0.0160540324767 avg reward (last 100): 339.050250898\n",
"Track generation: 1189..1490 -> 301-tiles track\n",
"episode: 70 iters 1000 total reward: 303.33333333332234 eps: 0.0160457635951 avg reward (last 100): 338.547195721\n",
"Track generation: 1369..1715 -> 346-tiles track\n",
"episode: 71 iters 1000 total reward: 204.34782608696003 eps: 0.0160375074775 avg reward (last 100): 336.683315587\n",
"Track generation: 1061..1334 -> 273-tiles track\n",
"retry to generate track (normal if there are not many of this messages)\n",
"Track generation: 1058..1334 -> 276-tiles track\n",
"episode: 72 iters 1000 total reward: 336.36363636363717 eps: 0.0160292640909 avg reward (last 100): 336.678936419\n",
"Track generation: 1064..1334 -> 270-tiles track\n",
"episode: 73 iters 1000 total reward: 167.6579925650597 eps: 0.0160210334028 avg reward (last 100): 334.394869611\n",
"Track generation: 1071..1343 -> 272-tiles track\n",
"episode: 74 iters 1000 total reward: 320.6642066420506 eps: 0.0160128153805 avg reward (last 100): 334.211794104\n",
"Track generation: 1060..1331 -> 271-tiles track\n",
"retry to generate track (normal if there are not many of this messages)\n",
"Track generation: 1232..1544 -> 312-tiles track\n",
"episode: 75 iters 1000 total reward: 144.372990353701 eps: 0.0160046099916 avg reward (last 100): 331.713915108\n",
"Track generation: 1094..1371 -> 277-tiles track\n",
"episode: 76 iters 1000 total reward: 367.39130434781066 eps: 0.0159964172038 avg reward (last 100): 332.177257825\n",
"Track generation: 1180..1479 -> 299-tiles track\n",
"episode: 77 iters 1000 total reward: 369.7986577181093 eps: 0.0159882369848 avg reward (last 100): 332.659583465\n",
"Track generation: 1255..1573 -> 318-tiles track\n",
"episode: 78 iters 1000 total reward: 306.9400630914817 eps: 0.0159800693025 avg reward (last 100): 332.334019916\n",
"Track generation: 1073..1345 -> 272-tiles track\n",
"episode: 79 iters 1000 total reward: 250.55350553505147 eps: 0.015971914125 avg reward (last 100): 331.311763486\n",
"Track generation: 1035..1298 -> 263-tiles track\n",
"episode: 80 iters 1000 total reward: 667.1755725190702 eps: 0.0159637714204 avg reward (last 100): 335.458230264\n",
"Track generation: 1155..1448 -> 293-tiles track\n",
"episode: 81 iters 1000 total reward: 427.397260273962 eps: 0.0159556411568 avg reward (last 100): 336.579437947\n",
"Track generation: 1144..1434 -> 290-tiles track\n",
"episode: 82 iters 1000 total reward: 439.7923875432428 eps: 0.0159475233027 avg reward (last 100): 337.82296746\n",
"Track generation: 1353..1695 -> 342-tiles track\n",
"episode: 83 iters 1000 total reward: 240.1759530791839 eps: 0.0159394178266 avg reward (last 100): 336.660503003\n",
"Track generation: 1196..1499 -> 303-tiles track\n",
"episode: 84 iters 1000 total reward: 512.5827814569415 eps: 0.0159313246969 avg reward (last 100): 338.730176868\n",
"Track generation: 1123..1408 -> 285-tiles track\n",
"episode: 85 iters 1000 total reward: 512.6760563380216 eps: 0.0159232438825 avg reward (last 100): 340.752803373\n",
"Track generation: 1032..1299 -> 267-tiles track\n",
"episode: 86 iters 1000 total reward: 264.6616541353229 eps: 0.015915175352 avg reward (last 100): 339.878192462\n",
"Track generation: 1050..1323 -> 273-tiles track\n",
"episode: 87 iters 1000 total reward: 422.0588235294081 eps: 0.0159071190744 avg reward (last 100): 340.81206327\n",
"Track generation: 1312..1644 -> 332-tiles track\n",
"episode: 88 iters 1000 total reward: 265.5589123867103 eps: 0.0158990750187 avg reward (last 100): 339.966522249\n",
"Track generation: 1138..1426 -> 288-tiles track\n",
"episode: 89 iters 1000 total reward: 394.7735191637532 eps: 0.0158910431541 avg reward (last 100): 340.575488881\n",
"Track generation: 1183..1483 -> 300-tiles track\n",
"episode: 90 iters 1000 total reward: 287.95986622072064 eps: 0.0158830234497 avg reward (last 100): 339.997295225\n",
"Track generation: 1183..1483 -> 300-tiles track\n",
"episode: 91 iters 1000 total reward: 107.35785953177773 eps: 0.015875015875 avg reward (last 100): 337.468605707\n",
"Track generation: 1054..1321 -> 267-tiles track\n",
"episode: 92 iters 1000 total reward: 648.1203007518607 eps: 0.0158670203994 avg reward (last 100): 340.808946514\n",
"Track generation: 1179..1478 -> 299-tiles track\n",
"episode: 93 iters 1000 total reward: 295.9731543624051 eps: 0.0158590369924 avg reward (last 100): 340.331970002\n",
"Track generation: 1326..1661 -> 335-tiles track\n",
"episode: 94 iters 1000 total reward: 181.4371257485079 eps: 0.0158510656237 avg reward (last 100): 338.659392694\n",
"Track generation: 1402..1756 -> 354-tiles track\n",
"episode: 95 iters 1000 total reward: 177.620396600571 eps: 0.0158431062631 avg reward (last 100): 336.981903151\n",
"Track generation: 1087..1362 -> 275-tiles track\n",
"episode: 96 iters 1000 total reward: 666.423357664216 eps: 0.0158351588805 avg reward (last 100): 340.378206806\n",
"Track generation: 1283..1608 -> 325-tiles track\n",
"episode: 97 iters 1000 total reward: 165.4320987654369 eps: 0.0158272234458 avg reward (last 100): 338.593042438\n",
"Track generation: 1120..1404 -> 284-tiles track\n",
"episode: 98 iters 1000 total reward: 2.4734982332150035 eps: 0.0158192999292 avg reward (last 100): 335.197895527\n",
"Track generation: 1240..1554 -> 314-tiles track\n",
"episode: 99 iters 1000 total reward: 229.07348242810934 eps: 0.0158113883008 avg reward (last 100): 334.136651396\n",
"Track generation: 1047..1313 -> 266-tiles track\n",
"episode: 100 iters 1000 total reward: 707.5471698113072 eps: 0.015803488531 avg reward (last 100): 337.833785242\n",
"Track generation: 1317..1650 -> 333-tiles track\n",
"episode: 101 iters 1000 total reward: 415.06024096384306 eps: 0.0157956005902 avg reward (last 100): 341.601148272\n",
"avg reward for last 100 episodes: 342.694900618\n",
"total steps: 34536.2725504\n"
]
},
{
"data": {
"image/png": "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\ncf4fkMLbBFBdDmcAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1cfa7a44f60>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\nRK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1cfa357bba8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# from IPython.display import clear_output\n",
"\n",
"model = Model(env)\n",
"gamma = 0.99\n",
"\n",
"N = 102\n",
"totalrewards = np.empty(N)\n",
"costs = np.empty(N)\n",
"for n in range(N):\n",
" eps = 0.5/np.sqrt(n+1 + 900) \n",
" totalreward, iters = play_one(env, model, eps, gamma)\n",
" totalrewards[n] = totalreward\n",
" if n % 1 == 0:\n",
" print(\"episode:\", n, \"iters\", iters, \"total reward:\", totalreward, \"eps:\", eps, \"avg reward (last 100):\", totalrewards[max(0, n-100):(n+1)].mean()) \n",
" if n % 10 == 0:\n",
" model.model.save('race-car.h5')\n",
"\n",
"print(\"avg reward for last 100 episodes:\", totalrewards[-100:].mean())\n",
"print(\"total steps:\", totalrewards.sum())\n",
"\n",
"plt.plot(totalrewards)\n",
"plt.title(\"Rewards\")\n",
"plt.show()\n",
"\n",
"plot_running_avg(totalrewards)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"model.model.save('race-car.h5')"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"[2017-08-30 13:41:42,784] Finished writing results. You can upload them to the scoreboard via gym.upload('C:\\\\Users\\\\lucpr\\\\Documents\\\\nn\\\\rl\\\\monitor-folder')\n"
]
}
],
"source": [
"env.close()"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"### ---------------------------------------"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python [conda env:tensorflow]",
"language": "python",
"name": "conda-env-tensorflow-py"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment