Created
September 14, 2020 20:19
-
-
Save kobus-v-schoor/3f432de917ee653f13f5ca8fe828e801 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# Implementation of a policy-gradient based agent to solve the cartpole RL problem\n", | |
"# Adapted from https://github.com/awjuliani/DeepRL-Agents/blob/master/Vanilla-Policy.ipynb" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import gym\n", | |
"import numpy as np\n", | |
"import tensorflow as tf\n", | |
"\n", | |
"from tensorflow import keras\n", | |
"from tensorflow.keras.layers import Dense\n", | |
"\n", | |
"import matplotlib.pyplot as plt\n", | |
"from tqdm import tqdm" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"env = gym.make('CartPole-v0')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# discounting of rewards is done so that earlier actions are rewarded\n", | |
"gamma = 0.99\n", | |
"def discount_rewards(rewards):\n", | |
" for t in reversed(range(0, len(rewards)-1)):\n", | |
" rewards[t] += rewards[t+1] * gamma\n", | |
" return rewards\n", | |
"\n", | |
"optimizer = keras.optimizers.Adam(lr=1e-3)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# softmax output layer ensures outputs can be used as probabilities\n", | |
"model = keras.models.Sequential([\n", | |
" Dense(8, input_shape=env.observation_space.shape, activation='relu'),\n", | |
" Dense(env.action_space.n, activation='softmax')\n", | |
"])\n", | |
"\n", | |
"# responsible actions are rewarded/punished (idx is generated later on)\n", | |
"loss = lambda: -tf.reduce_mean(tf.math.log(tf.gather_nd(model(states), idx)) * rewards)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"100%|██████████| 5000/5000 [03:05<00:00, 26.91it/s]\n" | |
] | |
} | |
], | |
"source": [ | |
"# total number of episodes\n", | |
"num_episodes = 5000\n", | |
"# how frequently (in number of episodes) the network should be trained\n", | |
"update_freq = 10\n", | |
"\n", | |
"# stores the number of steps the pole was kept upright for each episode\n", | |
"steps = []\n", | |
"\n", | |
"# holds the experiences\n", | |
"states = []\n", | |
"actions = []\n", | |
"rewards = []\n", | |
"\n", | |
"for episode in tqdm(range(num_episodes)):\n", | |
" state = env.reset()\n", | |
" done = False\n", | |
" \n", | |
" # will hold the rewards for just this episode\n", | |
" temp_rewards = []\n", | |
"\n", | |
" while not done:\n", | |
" # record current state\n", | |
" states.append(state)\n", | |
" # convert state to suitable input for model\n", | |
" state = np.array([state])\n", | |
" \n", | |
" # select action randomly with a distribution determined by the model output\n", | |
" action = np.random.choice(range(2), p=model(state).numpy().flatten())\n", | |
" # record action\n", | |
" actions.append(action)\n", | |
" \n", | |
" # calculate next state\n", | |
" nstate, reward, done, info = env.step(action)\n", | |
" \n", | |
" # record reward\n", | |
" temp_rewards.append(reward)\n", | |
" \n", | |
" state = nstate\n", | |
" \n", | |
" # record number of steps\n", | |
" steps.append(len(temp_rewards))\n", | |
" \n", | |
" # record discounted rewards\n", | |
" rewards += discount_rewards(temp_rewards)\n", | |
" \n", | |
" # check if training should happen\n", | |
" if episode % update_freq == 0:\n", | |
" # get states and rewards into suitable shape for model input\n", | |
" states = np.array(states)\n", | |
" rewards = np.array(rewards)\n", | |
" \n", | |
" # calculate a list of indexes of the responsible outputs for each action taken\n", | |
" idx = np.array(list(zip(range(len(actions)), actions)))\n", | |
"\n", | |
" # update the policy network\n", | |
" optimizer.minimize(loss, model.trainable_variables)\n", | |
" \n", | |
" # reset everything\n", | |
" states = []\n", | |
" rewards = []\n", | |
" actions = []" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[<matplotlib.lines.Line2D at 0x7f0310569d30>]" | |
] | |
}, | |
"execution_count": 7, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
] | |
}, | |
"metadata": { | |
"needs_background": "light" | |
}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plt.plot(steps)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[<matplotlib.lines.Line2D at 0x7f031024aef0>]" | |
] | |
}, | |
"execution_count": 9, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
] | |
}, | |
"metadata": { | |
"needs_background": "light" | |
}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"# plot smoothed out steps graph\n", | |
"avg = []\n", | |
"for i in range(100, len(steps)+1, 100):\n", | |
" avg.append(sum(steps[i-100:i]) / 100)\n", | |
" \n", | |
"plt.plot(range(0, num_episodes, 100), avg)" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"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.7.3" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 4 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment