From b95b474bb592b4973bf7dd1be4d43f7a81139d35 Mon Sep 17 00:00:00 2001 From: Exception4U Date: Tue, 26 Sep 2017 21:51:57 +0530 Subject: [PATCH 1/3] studying Recurrent Q learning --- Deep-Recurrent-Q-Network.ipynb | 134 +++++++++++++++++++++++---------- Double-Dueling-DQN.ipynb | 121 ++++++----------------------- Q-Network.ipynb | 89 ++++++++++++++-------- 3 files changed, 176 insertions(+), 168 deletions(-) diff --git a/Deep-Recurrent-Q-Network.ipynb b/Deep-Recurrent-Q-Network.ipynb index 22205a2..68461ad 100644 --- a/Deep-Recurrent-Q-Network.ipynb +++ b/Deep-Recurrent-Q-Network.ipynb @@ -13,9 +13,9 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": { - "collapsed": false + "collapsed": true }, "outputs": [], "source": [ @@ -42,7 +42,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": { "collapsed": true }, @@ -62,22 +62,40 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "env = gameEnv(partial=False,size=9)" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "env = gameEnv(partial=True,size=9)" ] @@ -98,9 +116,9 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": { - "collapsed": false + "collapsed": true }, "outputs": [], "source": [ @@ -188,9 +206,9 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": { - "collapsed": false + "collapsed": true }, "outputs": [], "source": [ @@ -223,7 +241,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": { "collapsed": true }, @@ -250,12 +268,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": { - "collapsed": false, "scrolled": true }, - "outputs": [], + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'module' object has no attribute 'BasicLSTMCell'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mtf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreset_default_graph\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;31m#We define the cells for the primary and target q-networks\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mcell\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontrib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrnn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mBasicLSTMCell\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnum_units\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mh_size\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mstate_is_tuple\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0mcellT\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontrib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrnn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mBasicLSTMCell\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnum_units\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mh_size\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mstate_is_tuple\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mmainQN\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mQnetwork\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mh_size\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mcell\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'main'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mAttributeError\u001b[0m: 'module' object has no attribute 'BasicLSTMCell'" + ] + } + ], "source": [ "tf.reset_default_graph()\n", "#We define the cells for the primary and target q-networks\n", @@ -316,11 +345,17 @@ " #Choose an action by greedily (with e chance of random action) from the Q-network\n", " if np.random.rand(1) < e or total_steps < pre_train_steps:\n", " state1 = sess.run(mainQN.rnn_state,\\\n", - " feed_dict={mainQN.scalarInput:[s/255.0],mainQN.trainLength:1,mainQN.state_in:state,mainQN.batch_size:1})\n", + " feed_dict={mainQN.scalarInput:[s/255.0],\\\n", + " mainQN.trainLength:1,\\\n", + " mainQN.state_in:state,\\\n", + " mainQN.batch_size:1})\n", " a = np.random.randint(0,4)\n", " else:\n", " a, state1 = sess.run([mainQN.predict,mainQN.rnn_state],\\\n", - " feed_dict={mainQN.scalarInput:[s/255.0],mainQN.trainLength:1,mainQN.state_in:state,mainQN.batch_size:1})\n", + " feed_dict={mainQN.scalarInput:[s/255.0],\\\n", + " mainQN.trainLength:1,\\\n", + " mainQN.state_in:state,\\\n", + " mainQN.batch_size:1})\n", " a = a[0]\n", " s1P,r,d = env.step(a)\n", " s1 = processState(s1P)\n", @@ -339,10 +374,14 @@ " #Below we perform the Double-DQN update to the target Q-values\n", " Q1 = sess.run(mainQN.predict,feed_dict={\\\n", " mainQN.scalarInput:np.vstack(trainBatch[:,3]/255.0),\\\n", - " mainQN.trainLength:trace_length,mainQN.state_in:state_train,mainQN.batch_size:batch_size})\n", + " mainQN.trainLength:trace_length,\\\n", + " mainQN.state_in:state_train,\\\n", + " mainQN.batch_size:batch_size})\n", " Q2 = sess.run(targetQN.Qout,feed_dict={\\\n", " targetQN.scalarInput:np.vstack(trainBatch[:,3]/255.0),\\\n", - " targetQN.trainLength:trace_length,targetQN.state_in:state_train,targetQN.batch_size:batch_size})\n", + " targetQN.trainLength:trace_length,\\\n", + " targetQN.state_in:state_train,\\\n", + " targetQN.batch_size:batch_size})\n", " end_multiplier = -(trainBatch[:,4] - 1)\n", " doubleQ = Q2[range(batch_size*trace_length),Q1]\n", " targetQ = trainBatch[:,2] + (y*doubleQ * end_multiplier)\n", @@ -388,7 +427,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": { "collapsed": true }, @@ -407,11 +446,21 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "ename": "FileNotFoundError", + "evalue": "[Errno 2] No such file or directory: './Center/log.csv'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0;31m##Write the first line of the master log-file for the Control Center\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 21\u001b[0;31m \u001b[0;32mwith\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'./Center/log.csv'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'w'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mmyfile\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 22\u001b[0m \u001b[0mwr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcsv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwriter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmyfile\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mquoting\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcsv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mQUOTE_ALL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 23\u001b[0m \u001b[0mwr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwriterow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'Episode'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'Length'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'Reward'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'IMG'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'LOG'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'SAL'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: './Center/log.csv'" + ] + } + ], "source": [ "tf.reset_default_graph()\n", "cell = tf.contrib.rnn.BasicLSTMCell(num_units=h_size,state_is_tuple=True)\n", @@ -457,12 +506,16 @@ " j = 0\n", " state = (np.zeros([1,h_size]),np.zeros([1,h_size]))\n", " #The Q-Network\n", - " while j < max_epLength: #If the agent takes longer than 200 moves to reach either of the blocks, end the trial.\n", + " while j < max_epLength: #If the agent takes longer than 200 \n", + " #moves to reach either of the blocks, end the trial.\n", " j+=1\n", " #Choose an action by greedily (with e chance of random action) from the Q-network\n", " if np.random.rand(1) < e:\n", " state1 = sess.run(mainQN.rnn_state,\\\n", - " feed_dict={mainQN.scalarInput:[s/255.0],mainQN.trainLength:1,mainQN.state_in:state,mainQN.batch_size:1})\n", + " feed_dict={mainQN.scalarInput:[s/255.0],\\\n", + " mainQN.trainLength:1,\\\n", + " mainQN.state_in:state,\\\n", + " mainQN.batch_size:1})\n", " a = np.random.randint(0,4)\n", " else:\n", " a, state1 = sess.run([mainQN.predict,mainQN.rnn_state],\\\n", @@ -472,7 +525,8 @@ " s1P,r,d = env.step(a)\n", " s1 = processState(s1P)\n", " total_steps += 1\n", - " episodeBuffer.append(np.reshape(np.array([s,a,r,s1,d]),[1,5])) #Save the experience to our episode buffer.\n", + " episodeBuffer.append(np.reshape(np.array([s,a,r,s1,d]),[1,5])) #Save the experience\n", + " #to our episode buffer.\n", " rAll += r\n", " s = s1\n", " sP = s1P\n", @@ -496,23 +550,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "tensorflow_py3", "language": "python", - "name": "python2" + "name": "tensorflow_py3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.4.3" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Double-Dueling-DQN.ipynb b/Double-Dueling-DQN.ipynb index 15619b2..9d0c9fb 100644 --- a/Double-Dueling-DQN.ipynb +++ b/Double-Dueling-DQN.ipynb @@ -2,10 +2,7 @@ "cells": [ { "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true - }, + "metadata": {}, "source": [ "# Simple Reinforcement Learning with Tensorflow Part 4: Deep Q-Networks and Beyond\n", "\n", @@ -18,11 +15,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false, - "deletable": true, - "editable": true - }, + "metadata": {}, "outputs": [], "source": [ "from __future__ import division\n", @@ -40,20 +33,14 @@ }, { "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true - }, + "metadata": {}, "source": [ "### Load the game environment" ] }, { "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true - }, + "metadata": {}, "source": [ "Feel free to adjust the size of the gridworld. Making it smaller provides an easier task for our DQN agent, while making the world larger increases the challenge." ] @@ -62,9 +49,6 @@ "cell_type": "code", "execution_count": 2, "metadata": { - "collapsed": false, - "deletable": true, - "editable": true, "scrolled": false }, "outputs": [ @@ -87,20 +71,14 @@ }, { "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true - }, + "metadata": {}, "source": [ "Above is an example of a starting environment in our simple game. The agent controls the blue square, and can move up, down, left, or right. The goal is to move to the green square (for +1 reward) and avoid the red square (for -1 reward). The position of the three blocks is randomized every episode." ] }, { "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true - }, + "metadata": {}, "source": [ "### Implementing the network itself" ] @@ -108,11 +86,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false, - "deletable": true, - "editable": true - }, + "metadata": {}, "outputs": [], "source": [ "class Qnetwork():\n", @@ -159,20 +133,14 @@ }, { "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true - }, + "metadata": {}, "source": [ "### Experience Replay" ] }, { "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true - }, + "metadata": {}, "source": [ "This class allows us to store experies and sample then randomly to train the network." ] @@ -181,9 +149,7 @@ "cell_type": "code", "execution_count": 4, "metadata": { - "collapsed": true, - "deletable": true, - "editable": true + "collapsed": true }, "outputs": [], "source": [ @@ -203,10 +169,7 @@ }, { "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true - }, + "metadata": {}, "source": [ "This is a simple function to resize our game frames." ] @@ -214,11 +177,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false, - "deletable": true, - "editable": true - }, + "metadata": {}, "outputs": [], "source": [ "def processState(states):\n", @@ -227,10 +186,7 @@ }, { "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true - }, + "metadata": {}, "source": [ "These functions allow us to update the parameters of our target network with those of the primary network." ] @@ -238,11 +194,7 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false, - "deletable": true, - "editable": true - }, + "metadata": {}, "outputs": [], "source": [ "def updateTargetGraph(tfVars,tau):\n", @@ -259,20 +211,14 @@ }, { "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true - }, + "metadata": {}, "source": [ "### Training the network" ] }, { "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true - }, + "metadata": {}, "source": [ "Setting all the training parameters" ] @@ -281,9 +227,7 @@ "cell_type": "code", "execution_count": 7, "metadata": { - "collapsed": true, - "deletable": true, - "editable": true + "collapsed": true }, "outputs": [], "source": [ @@ -306,9 +250,6 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": false, - "deletable": true, - "editable": true, "scrolled": true }, "outputs": [ @@ -437,20 +378,14 @@ }, { "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true - }, + "metadata": {}, "source": [ "### Checking network learning" ] }, { "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true - }, + "metadata": {}, "source": [ "Mean reward over time" ] @@ -458,11 +393,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false, - "deletable": true, - "editable": true - }, + "metadata": {}, "outputs": [], "source": [ "rMat = np.resize(np.array(rList),[len(rList)//100,100])\n", @@ -474,9 +405,7 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": true, - "deletable": true, - "editable": true + "collapsed": true }, "outputs": [], "source": [] @@ -485,9 +414,9 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python [conda env:py2]", + "display_name": "Python 2", "language": "python", - "name": "conda-env-py2-py" + "name": "python2" }, "language_info": { "codemirror_mode": { @@ -499,9 +428,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.13" + "version": "2.7.6" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/Q-Network.ipynb b/Q-Network.ipynb index 99754c2..a1b8b3f 100644 --- a/Q-Network.ipynb +++ b/Q-Network.ipynb @@ -40,7 +40,6 @@ "cell_type": "code", "execution_count": 2, "metadata": { - "collapsed": false, "scrolled": false }, "outputs": [ @@ -48,7 +47,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "[2017-03-09 18:45:29,847] Making new env: FrozenLake-v0\n" + "[2017-09-26 21:10:35,507] Making new env: FrozenLake-v0\n" ] } ], @@ -72,9 +71,9 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": { - "collapsed": false + "collapsed": true }, "outputs": [], "source": [ @@ -83,9 +82,9 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": { - "collapsed": false + "collapsed": true }, "outputs": [], "source": [ @@ -111,17 +110,25 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "metadata": { - "collapsed": false, "scrolled": true }, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Percent of succesful episodes: 0.2685%\n" + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 26\u001b[0m \u001b[0ms1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0m_\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0menv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 27\u001b[0m \u001b[0;31m#Obtain the Q' values by feeding the new state through our network\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 28\u001b[0;31m \u001b[0mQ1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msess\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mQout\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mfeed_dict\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0minputs1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0midentity\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m16\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0ms1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0ms1\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 29\u001b[0m \u001b[0;31m#Obtain maxQ' and set our target value for chosen action.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 30\u001b[0m \u001b[0mmaxQ1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mQ1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/tensorflow_py3/lib/python3.4/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36mrun\u001b[0;34m(self, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m 893\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 894\u001b[0m result = self._run(None, fetches, feed_dict, options_ptr,\n\u001b[0;32m--> 895\u001b[0;31m run_metadata_ptr)\n\u001b[0m\u001b[1;32m 896\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrun_metadata\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 897\u001b[0m \u001b[0mproto_data\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf_session\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTF_GetBuffer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrun_metadata_ptr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/tensorflow_py3/lib/python3.4/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_run\u001b[0;34m(self, handle, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m 1122\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mfinal_fetches\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mfinal_targets\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mhandle\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mfeed_dict_tensor\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1123\u001b[0m results = self._do_run(handle, final_targets, final_fetches,\n\u001b[0;32m-> 1124\u001b[0;31m feed_dict_tensor, options, run_metadata)\n\u001b[0m\u001b[1;32m 1125\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1126\u001b[0m \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/tensorflow_py3/lib/python3.4/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_do_run\u001b[0;34m(self, handle, target_list, fetch_list, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m 1319\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhandle\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1320\u001b[0m return self._do_call(_run_fn, self._session, feeds, fetches, targets,\n\u001b[0;32m-> 1321\u001b[0;31m options, run_metadata)\n\u001b[0m\u001b[1;32m 1322\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1323\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_do_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_prun_fn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_session\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhandle\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeeds\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfetches\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/tensorflow_py3/lib/python3.4/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_do_call\u001b[0;34m(self, fn, *args)\u001b[0m\n\u001b[1;32m 1325\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_do_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1326\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1327\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1328\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mOpError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1329\u001b[0m \u001b[0mmessage\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcompat\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mas_text\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmessage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/tensorflow_py3/lib/python3.4/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_run_fn\u001b[0;34m(session, feed_dict, fetch_list, target_list, options, run_metadata)\u001b[0m\n\u001b[1;32m 1304\u001b[0m return tf_session.TF_Run(session, options,\n\u001b[1;32m 1305\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfetch_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtarget_list\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1306\u001b[0;31m status, run_metadata)\n\u001b[0m\u001b[1;32m 1307\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1308\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_prun_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msession\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhandle\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfetch_list\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] } ], @@ -187,26 +194,24 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, + "execution_count": 8, + "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[]" + "[]" ] }, - "execution_count": 6, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\ncBcRCdD/BzyrMqQv30C5AAAAAElFTkSuQmCC\n", + "image/png": "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\nn+7gAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -226,27 +231,26 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": { - "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ - "[]" + "[]" ] }, - "execution_count": 7, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n2cwAAAAASUVORK5CYII=\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -257,6 +261,27 @@ "plt.plot(jList)" ] }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'0.12.1'" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import tensorflow as tf\n", + "tf.__version__" + ] + }, { "cell_type": "code", "execution_count": null, @@ -270,23 +295,23 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python [conda env:py2]", + "display_name": "tensorflow_py3", "language": "python", - "name": "conda-env-py2-py" + "name": "tensorflow_py3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.13" + "pygments_lexer": "ipython3", + "version": "3.4.3" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } From d773b0fa5597d2bd59629d580ca295c519cc7ea7 Mon Sep 17 00:00:00 2001 From: Exception4U Date: Mon, 2 Oct 2017 03:29:34 +0530 Subject: [PATCH 2/3] working Q network for simplified Breakout-v0 version --- Q-Network.ipynb | 1372 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 1342 insertions(+), 30 deletions(-) diff --git a/Q-Network.ipynb b/Q-Network.ipynb index a1b8b3f..4ad648e 100644 --- a/Q-Network.ipynb +++ b/Q-Network.ipynb @@ -39,20 +39,83 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "scrolled": false - }, + "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "[2017-09-26 21:10:35,507] Making new env: FrozenLake-v0\n" + "[2017-10-02 03:25:25,869] Making new env: Breakout-v0\n" ] } ], "source": [ - "env = gym.make('FrozenLake-v0')" + "env= gym.make(\"Breakout-v0\")\n", + "# env = gym.make(\"FrozenLake-v0\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Box(210, 160, 3)" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "env.observation_space" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "actions = env.action_space\n", + "observations = env.observation_space\n", + "rst = env.reset()\n", + "observation,reward,done,info = env.step(0)\n", + "\n", + "def filter_observation(observation):\n", + " \"\"\"This module will return index of ball and index of\n", + " plate in 2D coordinate\"\"\"\n", + " sample = observation[100:185,10:150,:]\n", + " panel = observation[180:195,10:150,:]\n", + " ball_index = np.unravel_index(sample.argmax(), sample.shape)\n", + " plate_index = np.unravel_index(panel.argmax(), panel.shape)\n", + " return np.array(list(ball_index[0:2])+list(plate_index[0:2])).reshape(1,4)\n", + " \n", + "\n", + "filtered_observation = filter_observation(observation)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0, 0, 9, 89]])" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "filtered_observation.reshape(1,4)" ] }, { @@ -71,7 +134,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": { "collapsed": true }, @@ -82,20 +145,18 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": true - }, + "execution_count": 7, + "metadata": {}, "outputs": [], "source": [ "#These lines establish the feed-forward part of the network used to choose actions\n", - "inputs1 = tf.placeholder(shape=[1,16],dtype=tf.float32)\n", - "W = tf.Variable(tf.random_uniform([16,4],0,0.01))\n", + "inputs1 = tf.placeholder(shape=[1,4],dtype=tf.float32)\n", + "W = tf.Variable(tf.random_uniform([4,6],0,0.01))\n", "Qout = tf.matmul(inputs1,W)\n", "predict = tf.argmax(Qout,1)\n", "\n", "#Below we obtain the loss by taking the sum of squares difference between the target and prediction Q values.\n", - "nextQ = tf.placeholder(shape=[1,4],dtype=tf.float32)\n", + "nextQ = tf.placeholder(shape=[1,6],dtype=tf.float32)\n", "loss = tf.reduce_sum(tf.square(nextQ - Qout))\n", "trainer = tf.train.GradientDescentOptimizer(learning_rate=0.1)\n", "updateModel = trainer.minimize(loss)" @@ -110,25 +171,1273 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": { "scrolled": true }, "outputs": [ { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 26\u001b[0m \u001b[0ms1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mr\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0m_\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0menv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 27\u001b[0m \u001b[0;31m#Obtain the Q' values by feeding the new state through our network\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 28\u001b[0;31m \u001b[0mQ1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msess\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mQout\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mfeed_dict\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0minputs1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0midentity\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m16\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0ms1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0ms1\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 29\u001b[0m \u001b[0;31m#Obtain maxQ' and set our target value for chosen action.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 30\u001b[0m \u001b[0mmaxQ1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mQ1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/tensorflow_py3/lib/python3.4/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36mrun\u001b[0;34m(self, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m 893\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 894\u001b[0m result = self._run(None, fetches, feed_dict, options_ptr,\n\u001b[0;32m--> 895\u001b[0;31m run_metadata_ptr)\n\u001b[0m\u001b[1;32m 896\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrun_metadata\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 897\u001b[0m \u001b[0mproto_data\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf_session\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTF_GetBuffer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrun_metadata_ptr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/tensorflow_py3/lib/python3.4/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_run\u001b[0;34m(self, handle, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m 1122\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mfinal_fetches\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mfinal_targets\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mhandle\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mfeed_dict_tensor\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1123\u001b[0m results = self._do_run(handle, final_targets, final_fetches,\n\u001b[0;32m-> 1124\u001b[0;31m feed_dict_tensor, options, run_metadata)\n\u001b[0m\u001b[1;32m 1125\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1126\u001b[0m \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/tensorflow_py3/lib/python3.4/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_do_run\u001b[0;34m(self, handle, target_list, fetch_list, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m 1319\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhandle\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1320\u001b[0m return self._do_call(_run_fn, self._session, feeds, fetches, targets,\n\u001b[0;32m-> 1321\u001b[0;31m options, run_metadata)\n\u001b[0m\u001b[1;32m 1322\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1323\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_do_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_prun_fn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_session\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhandle\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeeds\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfetches\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/tensorflow_py3/lib/python3.4/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_do_call\u001b[0;34m(self, fn, *args)\u001b[0m\n\u001b[1;32m 1325\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_do_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1326\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1327\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1328\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mOpError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1329\u001b[0m \u001b[0mmessage\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcompat\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mas_text\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmessage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/tensorflow_py3/lib/python3.4/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_run_fn\u001b[0;34m(session, feed_dict, fetch_list, target_list, options, run_metadata)\u001b[0m\n\u001b[1;32m 1304\u001b[0m return tf_session.TF_Run(session, options,\n\u001b[1;32m 1305\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfetch_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtarget_list\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1306\u001b[0;31m status, run_metadata)\n\u001b[0m\u001b[1;32m 1307\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1308\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_prun_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msession\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhandle\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfetch_list\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n", + "1\n", + "2\n", + "3\n", + "4\n", + "5\n", + "6\n", + "7\n", + "8\n", + "9\n", + "10\n", + "11\n", + "12\n", + "13\n", + "14\n", + "15\n", + "16\n", + "17\n", + "18\n", + "19\n", + "20\n", + "21\n", + "22\n", + "23\n", + "24\n", + "25\n", + "26\n", + "27\n", + "28\n", + "29\n", + "30\n", + "31\n", + "32\n", + "33\n", + "34\n", + "35\n", + "36\n", + "37\n", + "38\n", + "39\n", + "40\n", + "41\n", + "42\n", + "43\n", + "44\n", + "45\n", + "46\n", + "47\n", + "48\n", + "49\n", + "50\n", + "51\n", + "52\n", + "53\n", + "54\n", + "55\n", + "56\n", + "57\n", + "58\n", + "59\n", + "60\n", + "61\n", + "62\n", + "63\n", + "64\n", + "65\n", + "66\n", + "67\n", + "68\n", + "69\n", + "70\n", + "71\n", + "72\n", + "73\n", + "74\n", + "75\n", + "76\n", + "77\n", + "78\n", + "79\n", + "80\n", + "81\n", + "82\n", + "83\n", + "84\n", + "85\n", + "86\n", + "87\n", + "88\n", + "89\n", + "90\n", + "91\n", + "92\n", + "93\n", + "94\n", + "95\n", + "96\n", + "97\n", + "98\n", + "99\n", + "100\n", + "101\n", + "102\n", + "103\n", + "104\n", + "105\n", + "106\n", + "107\n", + "108\n", + "109\n", + "110\n", + "111\n", + "112\n", + "113\n", + "114\n", + "115\n", + "116\n", + "117\n", + "118\n", + "119\n", + "120\n", + "121\n", + "122\n", + "123\n", + "124\n", + "125\n", + "126\n", + "127\n", + "128\n", + "129\n", + "130\n", + "131\n", + "132\n", + "133\n", + "134\n", + "135\n", + "136\n", + "137\n", + "138\n", + "139\n", + "140\n", + "141\n", + "142\n", + "143\n", + "144\n", + "145\n", + "146\n", + "147\n", + "148\n", + "149\n", + "150\n", + "151\n", + "152\n", + "153\n", + "154\n", + "155\n", + "156\n", + "157\n", + "158\n", + "159\n", + "160\n", + "161\n", + "162\n", + "163\n", + "164\n", + "165\n", + "166\n", + "167\n", + "168\n", + "169\n", + "170\n", + "171\n", + "172\n", + "173\n", + "174\n", + "175\n", + "176\n", + "177\n", + "178\n", + "179\n", + "180\n", + "181\n", + "182\n", + "183\n", + "184\n", + "185\n", + "186\n", + "187\n", + "188\n", + "189\n", + "190\n", + "191\n", + "192\n", + "193\n", + "194\n", + "195\n", + "196\n", + "197\n", + "198\n", + "199\n", + "200\n", + "201\n", + "202\n", + "203\n", + "204\n", + "205\n", + "206\n", + "207\n", + "208\n", + "209\n", + "210\n", + "211\n", + "212\n", + "213\n", + "214\n", + "215\n", + "216\n", + "217\n", + "218\n", + "219\n", + "220\n", + "221\n", + "222\n", + "223\n", + "224\n", + "225\n", + "226\n", + "227\n", + "228\n", + "229\n", + "230\n", + "231\n", + "232\n", + "233\n", + "234\n", + "235\n", + "236\n", + "237\n", + "238\n", + "239\n", + "240\n", + "241\n", + "242\n", + "243\n", + "244\n", + "245\n", + "246\n", + "247\n", + "248\n", + "249\n", + "250\n", + "251\n", + "252\n", + "253\n", + "254\n", + "255\n", + "256\n", + "257\n", + "258\n", + "259\n", + "260\n", + "261\n", + "262\n", + "263\n", + "264\n", + "265\n", + "266\n", + "267\n", + "268\n", + "269\n", + "270\n", + "271\n", + "272\n", + "273\n", + "274\n", + "275\n", + "276\n", + "277\n", + "278\n", + "279\n", + "280\n", + "281\n", + "282\n", + "283\n", + "284\n", + "285\n", + "286\n", + "287\n", + "288\n", + "289\n", + "290\n", + "291\n", + "292\n", + "293\n", + "294\n", + "295\n", + "296\n", + "297\n", + "298\n", + "299\n", + "300\n", + "301\n", + "302\n", + "303\n", + "304\n", + "305\n", + "306\n", + "307\n", + "308\n", + "309\n", + "310\n", + "311\n", + "312\n", + "313\n", + "314\n", + "315\n", + "316\n", + "317\n", + "318\n", + "319\n", + "320\n", + "321\n", + "322\n", + "323\n", + "324\n", + "325\n", + "326\n", + "327\n", + "328\n", + "329\n", + "330\n", + "331\n", + "332\n", + "333\n", + "334\n", + "335\n", + "336\n", + "337\n", + "338\n", + "339\n", + "340\n", + "341\n", + "342\n", + "343\n", + "344\n", + "345\n", + "346\n", + "347\n", + "348\n", + "349\n", + "350\n", + "351\n", + "352\n", + "353\n", + "354\n", + "355\n", + "356\n", + "357\n", + "358\n", + "359\n", + "360\n", + "361\n", + "362\n", + "363\n", + "364\n", + "365\n", + "366\n", + "367\n", + "368\n", + "369\n", + "370\n", + "371\n", + "372\n", + "373\n", + "374\n", + "375\n", + "376\n", + "377\n", + "378\n", + "379\n", + "380\n", + "381\n", + "382\n", + "383\n", + "384\n", + "385\n", + "386\n", + "387\n", + "388\n", + "389\n", + "390\n", + "391\n", + "392\n", + "393\n", + "394\n", + "395\n", + "396\n", + "397\n", + "398\n", + "399\n", + "400\n", + "401\n", + "402\n", + "403\n", + "404\n", + "405\n", + "406\n", + "407\n", + "408\n", + "409\n", + "410\n", + "411\n", + "412\n", + "413\n", + "414\n", + "415\n", + "416\n", + "417\n", + "418\n", + "419\n", + "420\n", + "421\n", + "422\n", + "423\n", + "424\n", + "425\n", + "426\n", + "427\n", + "428\n", + "429\n", + "430\n", + "431\n", + "432\n", + "433\n", + "434\n", + "435\n", + "436\n", + "437\n", + "438\n", + "439\n", + "440\n", + "441\n", + "442\n", + "443\n", + "444\n", + "445\n", + "446\n", + "447\n", + "448\n", + "449\n", + "450\n", + "451\n", + "452\n", + "453\n", + "454\n", + "455\n", + "456\n", + "457\n", + "458\n", + "459\n", + "460\n", + "461\n", + "462\n", + "463\n", + "464\n", + "465\n", + "466\n", + "467\n", + "468\n", + "469\n", + "470\n", + "471\n", + "472\n", + "473\n", + "474\n", + "475\n", + "476\n", + "477\n", + "478\n", + "479\n", + "480\n", + "481\n", + "482\n", + "483\n", + "484\n", + "485\n", + "486\n", + "487\n", + "488\n", + "489\n", + "490\n", + "491\n", + "492\n", + "493\n", + "494\n", + "495\n", + "496\n", + "497\n", + "498\n", + "499\n", + "500\n", + "501\n", + "502\n", + "503\n", + "504\n", + "505\n", + "506\n", + "507\n", + "508\n", + "509\n", + "510\n", + "511\n", + "512\n", + "513\n", + "514\n", + "515\n", + "516\n", + "517\n", + "518\n", + "519\n", + "520\n", + "521\n", + "522\n", + "523\n", + "524\n", + "525\n", + "526\n", + "527\n", + "528\n", + "529\n", + "530\n", + "531\n", + "532\n", + "533\n", + "534\n", + "535\n", + "536\n", + "537\n", + "538\n", + "539\n", + "540\n", + "541\n", + "542\n", + "543\n", + "544\n", + "545\n", + "546\n", + "547\n", + "548\n", + "549\n", + "550\n", + "551\n", + "552\n", + "553\n", + "554\n", + "555\n", + "556\n", + "557\n", + "558\n", + "559\n", + "560\n", + "561\n", + "562\n", + "563\n", + "564\n", + "565\n", + "566\n", + "567\n", + "568\n", + "569\n", + "570\n", + "571\n", + "572\n", + "573\n", + "574\n", + "575\n", + "576\n", + "577\n", + "578\n", + "579\n", + "580\n", + "581\n", + "582\n", + "583\n", + "584\n", + "585\n", + "586\n", + "587\n", + "588\n", + "589\n", + "590\n", + "591\n", + "592\n", + "593\n", + "594\n", + "595\n", + "596\n", + "597\n", + "598\n", + "599\n", + "600\n", + "601\n", + "602\n", + "603\n", + "604\n", + "605\n", + "606\n", + "607\n", + "608\n", + "609\n", + "610\n", + "611\n", + "612\n", + "613\n", + "614\n", + "615\n", + "616\n", + "617\n", + "618\n", + "619\n", + "620\n", + "621\n", + "622\n", + "623\n", + "624\n", + "625\n", + "626\n", + "627\n", + "628\n", + "629\n", + "630\n", + "631\n", + "632\n", + "633\n", + "634\n", + "635\n", + "636\n", + "637\n", + "638\n", + "639\n", + "640\n", + "641\n", + "642\n", + "643\n", + "644\n", + "645\n", + "646\n", + "647\n", + "648\n", + "649\n", + "650\n", + "651\n", + "652\n", + "653\n", + "654\n", + "655\n", + "656\n", + "657\n", + "658\n", + "659\n", + "660\n", + "661\n", + "662\n", + "663\n", + "664\n", + "665\n", + "666\n", + "667\n", + "668\n", + "669\n", + "670\n", + "671\n", + "672\n", + "673\n", + "674\n", + "675\n", + "676\n", + "677\n", + "678\n", + "679\n", + "680\n", + "681\n", + "682\n", + "683\n", + "684\n", + "685\n", + "686\n", + "687\n", + "688\n", + "689\n", + "690\n", + "691\n", + "692\n", + "693\n", + "694\n", + "695\n", + "696\n", + "697\n", + "698\n", + "699\n", + "700\n", + "701\n", + "702\n", + "703\n", + "704\n", + "705\n", + "706\n", + "707\n", + "708\n", + "709\n", + "710\n", + "711\n", + "712\n", + "713\n", + "714\n", + "715\n", + "716\n", + "717\n", + "718\n", + "719\n", + "720\n", + "721\n", + "722\n", + "723\n", + "724\n", + "725\n", + "726\n", + "727\n", + "728\n", + "729\n", + "730\n", + "731\n", + "732\n", + "733\n", + "734\n", + "735\n", + "736\n", + "737\n", + "738\n", + "739\n", + "740\n", + "741\n", + "742\n", + "743\n", + "744\n", + "745\n", + "746\n", + "747\n", + "748\n", + "749\n", + "750\n", + "751\n", + "752\n", + "753\n", + "754\n", + "755\n", + "756\n", + "757\n", + "758\n", + "759\n", + "760\n", + "761\n", + "762\n", + "763\n", + "764\n", + "765\n", + "766\n", + "767\n", + "768\n", + "769\n", + "770\n", + "771\n", + "772\n", + "773\n", + "774\n", + "775\n", + "776\n", + "777\n", + "778\n", + "779\n", + "780\n", + "781\n", + "782\n", + "783\n", + "784\n", + "785\n", + "786\n", + "787\n", + "788\n", + "789\n", + "790\n", + "791\n", + "792\n", + "793\n", + "794\n", + "795\n", + "796\n", + "797\n", + "798\n", + "799\n", + "800\n", + "801\n", + "802\n", + "803\n", + "804\n", + "805\n", + "806\n", + "807\n", + "808\n", + "809\n", + "810\n", + "811\n", + "812\n", + "813\n", + "814\n", + "815\n", + "816\n", + "817\n", + "818\n", + "819\n", + "820\n", + "821\n", + "822\n", + "823\n", + "824\n", + "825\n", + "826\n", + "827\n", + "828\n", + "829\n", + "830\n", + "831\n", + "832\n", + "833\n", + "834\n", + "835\n", + "836\n", + "837\n", + "838\n", + "839\n", + "840\n", + "841\n", + "842\n", + "843\n", + "844\n", + "845\n", + "846\n", + "847\n", + "848\n", + "849\n", + "850\n", + "851\n", + "852\n", + "853\n", + "854\n", + "855\n", + "856\n", + "857\n", + "858\n", + "859\n", + "860\n", + "861\n", + "862\n", + "863\n", + "864\n", + "865\n", + "866\n", + "867\n", + "868\n", + "869\n", + "870\n", + "871\n", + "872\n", + "873\n", + "874\n", + "875\n", + "876\n", + "877\n", + "878\n", + "879\n", + "880\n", + "881\n", + "882\n", + "883\n", + "884\n", + "885\n", + "886\n", + "887\n", + "888\n", + "889\n", + "890\n", + "891\n", + "892\n", + "893\n", + "894\n", + "895\n", + "896\n", + "897\n", + "898\n", + "899\n", + "900\n", + "901\n", + "902\n", + "903\n", + "904\n", + "905\n", + "906\n", + "907\n", + "908\n", + "909\n", + "910\n", + "911\n", + "912\n", + "913\n", + "914\n", + "915\n", + "916\n", + "917\n", + "918\n", + "919\n", + "920\n", + "921\n", + "922\n", + "923\n", + "924\n", + "925\n", + "926\n", + "927\n", + "928\n", + "929\n", + "930\n", + "931\n", + "932\n", + "933\n", + "934\n", + "935\n", + "936\n", + "937\n", + "938\n", + "939\n", + "940\n", + "941\n", + "942\n", + "943\n", + "944\n", + "945\n", + "946\n", + "947\n", + "948\n", + "949\n", + "950\n", + "951\n", + "952\n", + "953\n", + "954\n", + "955\n", + "956\n", + "957\n", + "958\n", + "959\n", + "960\n", + "961\n", + "962\n", + "963\n", + "964\n", + "965\n", + "966\n", + "967\n", + "968\n", + "969\n", + "970\n", + "971\n", + "972\n", + "973\n", + "974\n", + "975\n", + "976\n", + "977\n", + "978\n", + "979\n", + "980\n", + "981\n", + "982\n", + "983\n", + "984\n", + "985\n", + "986\n", + "987\n", + "988\n", + "989\n", + "990\n", + "991\n", + "992\n", + "993\n", + "994\n", + "995\n", + "996\n", + "997\n", + "998\n", + "999\n", + "1000\n", + "1001\n", + "1002\n", + "1003\n", + "1004\n", + "1005\n", + "1006\n", + "1007\n", + "1008\n", + "1009\n", + "1010\n", + "1011\n", + "1012\n", + "1013\n", + "1014\n", + "1015\n", + "1016\n", + "1017\n", + "1018\n", + "1019\n", + "1020\n", + "1021\n", + "1022\n", + "1023\n", + "1024\n", + "1025\n", + "1026\n", + "1027\n", + "1028\n", + "1029\n", + "1030\n", + "1031\n", + "1032\n", + "1033\n", + "1034\n", + "1035\n", + "1036\n", + "1037\n", + "1038\n", + "1039\n", + "1040\n", + "1041\n", + "1042\n", + "1043\n", + "1044\n", + "1045\n", + "1046\n", + "1047\n", + "1048\n", + "1049\n", + "1050\n", + "1051\n", + "1052\n", + "1053\n", + "1054\n", + "1055\n", + "1056\n", + "1057\n", + "1058\n", + "1059\n", + "1060\n", + "1061\n", + "1062\n", + "1063\n", + "1064\n", + "1065\n", + "1066\n", + "1067\n", + "1068\n", + "1069\n", + "1070\n", + "1071\n", + "1072\n", + "1073\n", + "1074\n", + "1075\n", + "1076\n", + "1077\n", + "1078\n", + "1079\n", + "1080\n", + "1081\n", + "1082\n", + "1083\n", + "1084\n", + "1085\n", + "1086\n", + "1087\n", + "1088\n", + "1089\n", + "1090\n", + "1091\n", + "1092\n", + "1093\n", + "1094\n", + "1095\n", + "1096\n", + "1097\n", + "1098\n", + "1099\n", + "1100\n", + "1101\n", + "1102\n", + "1103\n", + "1104\n", + "1105\n", + "1106\n", + "1107\n", + "1108\n", + "1109\n", + "1110\n", + "1111\n", + "1112\n", + "1113\n", + "1114\n", + "1115\n", + "1116\n", + "1117\n", + "1118\n", + "1119\n", + "1120\n", + "1121\n", + "1122\n", + "1123\n", + "1124\n", + "1125\n", + "1126\n", + "1127\n", + "1128\n", + "1129\n", + "1130\n", + "1131\n", + "1132\n", + "1133\n", + "1134\n", + "1135\n", + "1136\n", + "1137\n", + "1138\n", + "1139\n", + "1140\n", + "1141\n", + "1142\n", + "1143\n", + "1144\n", + "1145\n", + "1146\n", + "1147\n", + "1148\n", + "1149\n", + "1150\n", + "1151\n", + "1152\n", + "1153\n", + "1154\n", + "1155\n", + "1156\n", + "1157\n", + "1158\n", + "1159\n", + "1160\n", + "1161\n", + "1162\n", + "1163\n", + "1164\n", + "1165\n", + "1166\n", + "1167\n", + "1168\n", + "1169\n", + "1170\n", + "1171\n", + "1172\n", + "1173\n", + "1174\n", + "1175\n", + "1176\n", + "1177\n", + "1178\n", + "1179\n", + "1180\n", + "1181\n", + "1182\n", + "1183\n", + "1184\n", + "1185\n", + "1186\n", + "1187\n", + "1188\n", + "1189\n", + "1190\n", + "1191\n", + "1192\n", + "1193\n", + "1194\n", + "1195\n", + "1196\n", + "1197\n", + "1198\n", + "1199\n", + "1200\n", + "1201\n", + "1202\n", + "1203\n", + "1204\n", + "1205\n", + "1206\n", + "1207\n", + "1208\n", + "1209\n", + "1210\n", + "1211\n", + "1212\n", + "1213\n", + "1214\n", + "1215\n", + "1216\n", + "1217\n", + "1218\n", + "1219\n", + "1220\n", + "1221\n", + "1222\n", + "1223\n", + "1224\n", + "1225\n", + "1226\n", + "1227\n", + "1228\n", + "1229\n", + "1230\n", + "1231\n", + "1232\n", + "1233\n", + "1234\n", + "1235\n", + "1236\n", + "1237\n", + "1238\n", + "1239\n", + "1240\n", + "1241\n", + "1242\n", + "1243\n", + "1244\n", + "1245\n", + "1246\n", + "1247\n", + "1248\n", + "1249\n", + "1250\n", + "1251\n", + "1252\n", + "1253\n", + "1254\n", + "1255\n", + "1256\n", + "1257\n" ] } ], @@ -147,26 +1456,29 @@ " for i in range(num_episodes):\n", " #Reset environment and get first new observation\n", " s = env.reset()\n", + " s = filter_observation(s)\n", " rAll = 0\n", " d = False\n", " j = 0\n", " #The Q-Network\n", + " print(i)\n", " while j < 99:\n", " j+=1\n", " #Choose an action by greedily (with e chance of random action) from the Q-network\n", - " a,allQ = sess.run([predict,Qout],feed_dict={inputs1:np.identity(16)[s:s+1]})\n", + " a,allQ = sess.run([predict,Qout],feed_dict={inputs1:s})\n", " if np.random.rand(1) < e:\n", " a[0] = env.action_space.sample()\n", " #Get new state and reward from environment\n", " s1,r,d,_ = env.step(a[0])\n", + " s1 = filter_observation(s1)\n", " #Obtain the Q' values by feeding the new state through our network\n", - " Q1 = sess.run(Qout,feed_dict={inputs1:np.identity(16)[s1:s1+1]})\n", + " Q1 = sess.run(Qout,feed_dict={inputs1:s1})\n", " #Obtain maxQ' and set our target value for chosen action.\n", " maxQ1 = np.max(Q1)\n", " targetQ = allQ\n", " targetQ[0,a[0]] = r + y*maxQ1\n", " #Train our network using target and predicted Q values\n", - " _,W1 = sess.run([updateModel,W],feed_dict={inputs1:np.identity(16)[s:s+1],nextQ:targetQ})\n", + " _,W1 = sess.run([updateModel,W],feed_dict={inputs1:s1,nextQ:targetQ})\n", " rAll += r\n", " s = s1\n", " if d == True:\n", From 2b19d10be1819b2d71643ca63b142d9588970372 Mon Sep 17 00:00:00 2001 From: Exception4U Date: Mon, 2 Oct 2017 03:57:14 +0530 Subject: [PATCH 3/3] tqdm bar added for convenience --- Q-Network.ipynb | 1315 +---------------------------------------------- 1 file changed, 24 insertions(+), 1291 deletions(-) diff --git a/Q-Network.ipynb b/Q-Network.ipynb index 4ad648e..af9f9c9 100644 --- a/Q-Network.ipynb +++ b/Q-Network.ipynb @@ -26,6 +26,7 @@ "import random\n", "import tensorflow as tf\n", "import matplotlib.pyplot as plt\n", + "from tqdm import tqdm\n", "%matplotlib inline" ] }, @@ -45,7 +46,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "[2017-10-02 03:25:25,869] Making new env: Breakout-v0\n" + "[2017-10-02 03:47:12,672] Making new env: Breakout-v0\n" ] } ], @@ -171,1277 +172,37 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": { "scrolled": true }, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "1999000it [05:27, 12438.00it/s] " + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "0\n", - "1\n", - "2\n", - "3\n", - "4\n", - "5\n", - "6\n", - "7\n", - "8\n", - "9\n", - "10\n", - "11\n", - "12\n", - "13\n", - "14\n", - "15\n", - "16\n", - "17\n", - "18\n", - "19\n", - "20\n", - "21\n", - "22\n", - "23\n", - "24\n", - "25\n", - "26\n", - "27\n", - "28\n", - "29\n", - "30\n", - "31\n", - "32\n", - "33\n", - "34\n", - "35\n", - "36\n", - "37\n", - "38\n", - "39\n", - "40\n", - "41\n", - "42\n", - "43\n", - "44\n", - "45\n", - "46\n", - "47\n", - "48\n", - "49\n", - "50\n", - "51\n", - "52\n", - "53\n", - "54\n", - "55\n", - "56\n", - "57\n", - "58\n", - "59\n", - "60\n", - "61\n", - "62\n", - "63\n", - "64\n", - "65\n", - "66\n", - "67\n", - "68\n", - "69\n", - "70\n", - "71\n", - "72\n", - "73\n", - "74\n", - "75\n", - "76\n", - "77\n", - "78\n", - "79\n", - "80\n", - "81\n", - "82\n", - "83\n", - "84\n", - "85\n", - "86\n", - "87\n", - "88\n", - "89\n", - "90\n", - "91\n", - "92\n", - "93\n", - "94\n", - "95\n", - "96\n", - "97\n", - "98\n", - "99\n", - "100\n", - "101\n", - "102\n", - "103\n", - "104\n", - "105\n", - "106\n", - "107\n", - "108\n", - "109\n", - "110\n", - "111\n", - "112\n", - "113\n", - "114\n", - "115\n", - "116\n", - "117\n", - "118\n", - "119\n", - "120\n", - "121\n", - "122\n", - "123\n", - "124\n", - "125\n", - "126\n", - "127\n", - "128\n", - "129\n", - "130\n", - "131\n", - "132\n", - "133\n", - "134\n", - "135\n", - "136\n", - "137\n", - "138\n", - "139\n", - "140\n", - "141\n", - "142\n", - "143\n", - "144\n", - "145\n", - "146\n", - "147\n", - "148\n", - "149\n", - "150\n", - "151\n", - "152\n", - "153\n", - "154\n", - "155\n", - "156\n", - "157\n", - "158\n", - "159\n", - "160\n", - "161\n", - "162\n", - "163\n", - "164\n", - "165\n", - "166\n", - "167\n", - "168\n", - "169\n", - "170\n", - "171\n", - "172\n", - "173\n", - "174\n", - "175\n", - "176\n", - "177\n", - "178\n", - "179\n", - "180\n", - "181\n", - "182\n", - "183\n", - "184\n", - "185\n", - "186\n", - "187\n", - "188\n", - "189\n", - "190\n", - "191\n", - "192\n", - "193\n", - "194\n", - "195\n", - "196\n", - "197\n", - "198\n", - "199\n", - "200\n", - "201\n", - "202\n", - "203\n", - "204\n", - "205\n", - "206\n", - "207\n", - "208\n", - "209\n", - "210\n", - "211\n", - "212\n", - "213\n", - "214\n", - "215\n", - "216\n", - "217\n", - "218\n", - "219\n", - "220\n", - "221\n", - "222\n", - "223\n", - "224\n", - "225\n", - "226\n", - "227\n", - "228\n", - "229\n", - "230\n", - "231\n", - "232\n", - "233\n", - "234\n", - "235\n", - "236\n", - "237\n", - "238\n", - "239\n", - "240\n", - "241\n", - "242\n", - "243\n", - "244\n", - "245\n", - "246\n", - "247\n", - "248\n", - "249\n", - "250\n", - "251\n", - "252\n", - "253\n", - "254\n", - "255\n", - "256\n", - "257\n", - "258\n", - "259\n", - "260\n", - "261\n", - "262\n", - "263\n", - "264\n", - "265\n", - "266\n", - "267\n", - "268\n", - "269\n", - "270\n", - "271\n", - "272\n", - "273\n", - "274\n", - "275\n", - "276\n", - "277\n", - "278\n", - "279\n", - "280\n", - "281\n", - "282\n", - "283\n", - "284\n", - "285\n", - "286\n", - "287\n", - "288\n", - "289\n", - "290\n", - "291\n", - "292\n", - "293\n", - "294\n", - "295\n", - "296\n", - "297\n", - "298\n", - "299\n", - "300\n", - "301\n", - "302\n", - "303\n", - "304\n", - "305\n", - "306\n", - "307\n", - "308\n", - "309\n", - "310\n", - "311\n", - "312\n", - "313\n", - "314\n", - "315\n", - "316\n", - "317\n", - "318\n", - "319\n", - "320\n", - "321\n", - "322\n", - "323\n", - "324\n", - "325\n", - "326\n", - "327\n", - "328\n", - "329\n", - "330\n", - "331\n", - "332\n", - "333\n", - "334\n", - "335\n", - "336\n", - "337\n", - "338\n", - "339\n", - "340\n", - "341\n", - "342\n", - "343\n", - "344\n", - "345\n", - "346\n", - "347\n", - "348\n", - "349\n", - "350\n", - "351\n", - "352\n", - "353\n", - "354\n", - "355\n", - "356\n", - "357\n", - "358\n", - "359\n", - "360\n", - "361\n", - "362\n", - "363\n", - "364\n", - "365\n", - "366\n", - "367\n", - "368\n", - "369\n", - "370\n", - "371\n", - "372\n", - "373\n", - "374\n", - "375\n", - "376\n", - "377\n", - "378\n", - "379\n", - "380\n", - "381\n", - "382\n", - "383\n", - "384\n", - "385\n", - "386\n", - "387\n", - "388\n", - "389\n", - "390\n", - "391\n", - "392\n", - "393\n", - "394\n", - "395\n", - "396\n", - "397\n", - "398\n", - "399\n", - "400\n", - "401\n", - "402\n", - "403\n", - "404\n", - "405\n", - "406\n", - "407\n", - "408\n", - "409\n", - "410\n", - "411\n", - "412\n", - "413\n", - "414\n", - "415\n", - "416\n", - "417\n", - "418\n", - "419\n", - "420\n", - "421\n", - "422\n", - "423\n", - "424\n", - "425\n", - "426\n", - "427\n", - "428\n", - "429\n", - "430\n", - "431\n", - "432\n", - "433\n", - "434\n", - "435\n", - "436\n", - "437\n", - "438\n", - "439\n", - "440\n", - "441\n", - "442\n", - "443\n", - "444\n", - "445\n", - "446\n", - "447\n", - "448\n", - "449\n", - "450\n", - "451\n", - "452\n", - "453\n", - "454\n", - "455\n", - "456\n", - "457\n", - "458\n", - "459\n", - "460\n", - "461\n", - "462\n", - "463\n", - "464\n", - "465\n", - "466\n", - "467\n", - "468\n", - "469\n", - "470\n", - "471\n", - "472\n", - "473\n", - "474\n", - "475\n", - "476\n", - "477\n", - "478\n", - "479\n", - "480\n", - "481\n", - "482\n", - "483\n", - "484\n", - "485\n", - "486\n", - "487\n", - "488\n", - "489\n", - "490\n", - "491\n", - "492\n", - "493\n", - "494\n", - "495\n", - "496\n", - "497\n", - "498\n", - "499\n", - "500\n", - "501\n", - "502\n", - "503\n", - "504\n", - "505\n", - "506\n", - "507\n", - "508\n", - "509\n", - "510\n", - "511\n", - "512\n", - "513\n", - "514\n", - "515\n", - "516\n", - "517\n", - "518\n", - "519\n", - "520\n", - "521\n", - "522\n", - "523\n", - "524\n", - "525\n", - "526\n", - "527\n", - "528\n", - "529\n", - "530\n", - "531\n", - "532\n", - "533\n", - "534\n", - "535\n", - "536\n", - "537\n", - "538\n", - "539\n", - "540\n", - "541\n", - "542\n", - "543\n", - "544\n", - "545\n", - "546\n", - "547\n", - "548\n", - "549\n", - "550\n", - "551\n", - "552\n", - "553\n", - "554\n", - "555\n", - "556\n", - "557\n", - "558\n", - "559\n", - "560\n", - "561\n", - "562\n", - "563\n", - "564\n", - "565\n", - "566\n", - "567\n", - "568\n", - "569\n", - "570\n", - "571\n", - "572\n", - "573\n", - "574\n", - "575\n", - "576\n", - "577\n", - "578\n", - "579\n", - "580\n", - "581\n", - "582\n", - "583\n", - "584\n", - "585\n", - "586\n", - "587\n", - "588\n", - "589\n", - "590\n", - "591\n", - "592\n", - "593\n", - "594\n", - "595\n", - "596\n", - "597\n", - "598\n", - "599\n", - "600\n", - "601\n", - "602\n", - "603\n", - "604\n", - "605\n", - "606\n", - "607\n", - "608\n", - "609\n", - "610\n", - "611\n", - "612\n", - "613\n", - "614\n", - "615\n", - "616\n", - "617\n", - "618\n", - "619\n", - "620\n", - "621\n", - "622\n", - "623\n", - "624\n", - "625\n", - "626\n", - "627\n", - "628\n", - "629\n", - "630\n", - "631\n", - "632\n", - "633\n", - "634\n", - "635\n", - "636\n", - "637\n", - "638\n", - "639\n", - "640\n", - "641\n", - "642\n", - "643\n", - "644\n", - "645\n", - "646\n", - "647\n", - "648\n", - "649\n", - "650\n", - "651\n", - "652\n", - "653\n", - "654\n", - "655\n", - "656\n", - "657\n", - "658\n", - "659\n", - "660\n", - "661\n", - "662\n", - "663\n", - "664\n", - "665\n", - "666\n", - "667\n", - "668\n", - "669\n", - "670\n", - "671\n", - "672\n", - "673\n", - "674\n", - "675\n", - "676\n", - "677\n", - "678\n", - "679\n", - "680\n", - "681\n", - "682\n", - "683\n", - "684\n", - "685\n", - "686\n", - "687\n", - "688\n", - "689\n", - "690\n", - "691\n", - "692\n", - "693\n", - "694\n", - "695\n", - "696\n", - "697\n", - "698\n", - "699\n", - "700\n", - "701\n", - "702\n", - "703\n", - "704\n", - "705\n", - "706\n", - "707\n", - "708\n", - "709\n", - "710\n", - "711\n", - "712\n", - "713\n", - "714\n", - "715\n", - "716\n", - "717\n", - "718\n", - "719\n", - "720\n", - "721\n", - "722\n", - "723\n", - "724\n", - "725\n", - "726\n", - "727\n", - "728\n", - "729\n", - "730\n", - "731\n", - "732\n", - "733\n", - "734\n", - "735\n", - "736\n", - "737\n", - "738\n", - "739\n", - "740\n", - "741\n", - "742\n", - "743\n", - "744\n", - "745\n", - "746\n", - "747\n", - "748\n", - "749\n", - "750\n", - "751\n", - "752\n", - "753\n", - "754\n", - "755\n", - "756\n", - "757\n", - "758\n", - "759\n", - "760\n", - "761\n", - "762\n", - "763\n", - "764\n", - "765\n", - "766\n", - "767\n", - "768\n", - "769\n", - "770\n", - "771\n", - "772\n", - "773\n", - "774\n", - "775\n", - "776\n", - "777\n", - "778\n", - "779\n", - "780\n", - "781\n", - "782\n", - "783\n", - "784\n", - "785\n", - "786\n", - "787\n", - "788\n", - "789\n", - "790\n", - "791\n", - "792\n", - "793\n", - "794\n", - "795\n", - "796\n", - "797\n", - "798\n", - "799\n", - "800\n", - "801\n", - "802\n", - "803\n", - "804\n", - "805\n", - "806\n", - "807\n", - "808\n", - "809\n", - "810\n", - "811\n", - "812\n", - "813\n", - "814\n", - "815\n", - "816\n", - "817\n", - "818\n", - "819\n", - "820\n", - "821\n", - "822\n", - "823\n", - "824\n", - "825\n", - "826\n", - "827\n", - "828\n", - "829\n", - "830\n", - "831\n", - "832\n", - "833\n", - "834\n", - "835\n", - "836\n", - "837\n", - "838\n", - "839\n", - "840\n", - "841\n", - "842\n", - "843\n", - "844\n", - "845\n", - "846\n", - "847\n", - "848\n", - "849\n", - "850\n", - "851\n", - "852\n", - "853\n", - "854\n", - "855\n", - "856\n", - "857\n", - "858\n", - "859\n", - "860\n", - "861\n", - "862\n", - "863\n", - "864\n", - "865\n", - "866\n", - "867\n", - "868\n", - "869\n", - "870\n", - "871\n", - "872\n", - "873\n", - "874\n", - "875\n", - "876\n", - "877\n", - "878\n", - "879\n", - "880\n", - "881\n", - "882\n", - "883\n", - "884\n", - "885\n", - "886\n", - "887\n", - "888\n", - "889\n", - "890\n", - "891\n", - "892\n", - "893\n", - "894\n", - "895\n", - "896\n", - "897\n", - "898\n", - "899\n", - "900\n", - "901\n", - "902\n", - "903\n", - "904\n", - "905\n", - "906\n", - "907\n", - "908\n", - "909\n", - "910\n", - "911\n", - "912\n", - "913\n", - "914\n", - "915\n", - "916\n", - "917\n", - "918\n", - "919\n", - "920\n", - "921\n", - "922\n", - "923\n", - "924\n", - "925\n", - "926\n", - "927\n", - "928\n", - "929\n", - "930\n", - "931\n", - "932\n", - "933\n", - "934\n", - "935\n", - "936\n", - "937\n", - "938\n", - "939\n", - "940\n", - "941\n", - "942\n", - "943\n", - "944\n", - "945\n", - "946\n", - "947\n", - "948\n", - "949\n", - "950\n", - "951\n", - "952\n", - "953\n", - "954\n", - "955\n", - "956\n", - "957\n", - "958\n", - "959\n", - "960\n", - "961\n", - "962\n", - "963\n", - "964\n", - "965\n", - "966\n", - "967\n", - "968\n", - "969\n", - "970\n", - "971\n", - "972\n", - "973\n", - "974\n", - "975\n", - "976\n", - "977\n", - "978\n", - "979\n", - "980\n", - "981\n", - "982\n", - "983\n", - "984\n", - "985\n", - "986\n", - "987\n", - "988\n", - "989\n", - "990\n", - "991\n", - "992\n", - "993\n", - "994\n", - "995\n", - "996\n", - "997\n", - "998\n", - "999\n", - "1000\n", - "1001\n", - "1002\n", - "1003\n", - "1004\n", - "1005\n", - "1006\n", - "1007\n", - "1008\n", - "1009\n", - "1010\n", - "1011\n", - "1012\n", - "1013\n", - "1014\n", - "1015\n", - "1016\n", - "1017\n", - "1018\n", - "1019\n", - "1020\n", - "1021\n", - "1022\n", - "1023\n", - "1024\n", - "1025\n", - "1026\n", - "1027\n", - "1028\n", - "1029\n", - "1030\n", - "1031\n", - "1032\n", - "1033\n", - "1034\n", - "1035\n", - "1036\n", - "1037\n", - "1038\n", - "1039\n", - "1040\n", - "1041\n", - "1042\n", - "1043\n", - "1044\n", - "1045\n", - "1046\n", - "1047\n", - "1048\n", - "1049\n", - "1050\n", - "1051\n", - "1052\n", - "1053\n", - "1054\n", - "1055\n", - "1056\n", - "1057\n", - "1058\n", - "1059\n", - "1060\n", - "1061\n", - "1062\n", - "1063\n", - "1064\n", - "1065\n", - "1066\n", - "1067\n", - "1068\n", - "1069\n", - "1070\n", - "1071\n", - "1072\n", - "1073\n", - "1074\n", - "1075\n", - "1076\n", - "1077\n", - "1078\n", - "1079\n", - "1080\n", - "1081\n", - "1082\n", - "1083\n", - "1084\n", - "1085\n", - "1086\n", - "1087\n", - "1088\n", - "1089\n", - "1090\n", - "1091\n", - "1092\n", - "1093\n", - "1094\n", - "1095\n", - "1096\n", - "1097\n", - "1098\n", - "1099\n", - "1100\n", - "1101\n", - "1102\n", - "1103\n", - "1104\n", - "1105\n", - "1106\n", - "1107\n", - "1108\n", - "1109\n", - "1110\n", - "1111\n", - "1112\n", - "1113\n", - "1114\n", - "1115\n", - "1116\n", - "1117\n", - "1118\n", - "1119\n", - "1120\n", - "1121\n", - "1122\n", - "1123\n", - "1124\n", - "1125\n", - "1126\n", - "1127\n", - "1128\n", - "1129\n", - "1130\n", - "1131\n", - "1132\n", - "1133\n", - "1134\n", - "1135\n", - "1136\n", - "1137\n", - "1138\n", - "1139\n", - "1140\n", - "1141\n", - "1142\n", - "1143\n", - "1144\n", - "1145\n", - "1146\n", - "1147\n", - "1148\n", - "1149\n", - "1150\n", - "1151\n", - "1152\n", - "1153\n", - "1154\n", - "1155\n", - "1156\n", - "1157\n", - "1158\n", - "1159\n", - "1160\n", - "1161\n", - "1162\n", - "1163\n", - "1164\n", - "1165\n", - "1166\n", - "1167\n", - "1168\n", - "1169\n", - "1170\n", - "1171\n", - "1172\n", - "1173\n", - "1174\n", - "1175\n", - "1176\n", - "1177\n", - "1178\n", - "1179\n", - "1180\n", - "1181\n", - "1182\n", - "1183\n", - "1184\n", - "1185\n", - "1186\n", - "1187\n", - "1188\n", - "1189\n", - "1190\n", - "1191\n", - "1192\n", - "1193\n", - "1194\n", - "1195\n", - "1196\n", - "1197\n", - "1198\n", - "1199\n", - "1200\n", - "1201\n", - "1202\n", - "1203\n", - "1204\n", - "1205\n", - "1206\n", - "1207\n", - "1208\n", - "1209\n", - "1210\n", - "1211\n", - "1212\n", - "1213\n", - "1214\n", - "1215\n", - "1216\n", - "1217\n", - "1218\n", - "1219\n", - "1220\n", - "1221\n", - "1222\n", - "1223\n", - "1224\n", - "1225\n", - "1226\n", - "1227\n", - "1228\n", - "1229\n", - "1230\n", - "1231\n", - "1232\n", - "1233\n", - "1234\n", - "1235\n", - "1236\n", - "1237\n", - "1238\n", - "1239\n", - "1240\n", - "1241\n", - "1242\n", - "1243\n", - "1244\n", - "1245\n", - "1246\n", - "1247\n", - "1248\n", - "1249\n", - "1250\n", - "1251\n", - "1252\n", - "1253\n", - "1254\n", - "1255\n", - "1256\n", - "1257\n" + "Percent of succesful episodes: 0.16%\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " \r", + "1999000it [05:40, 12438.00it/s]" ] } ], "source": [ + "pbar = tqdm(total=2000)#progress bar variable\n", "init = tf.global_variables_initializer()\n", "\n", "# Set learning parameters\n", @@ -1451,6 +212,7 @@ "#create lists to contain total rewards and steps per episode\n", "jList = []\n", "rList = []\n", + "\n", "with tf.Session() as sess:\n", " sess.run(init)\n", " for i in range(num_episodes):\n", @@ -1461,7 +223,7 @@ " d = False\n", " j = 0\n", " #The Q-Network\n", - " print(i)\n", + " \n", " while j < 99:\n", " j+=1\n", " #Choose an action by greedily (with e chance of random action) from the Q-network\n", @@ -1487,6 +249,7 @@ " break\n", " jList.append(j)\n", " rList.append(rAll)\n", + " pbar.update(i)\n", "print(\"Percent of succesful episodes: \" + str(sum(rList)/num_episodes) + \"%\")" ] }, @@ -1572,36 +335,6 @@ "source": [ "plt.plot(jList)" ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'0.12.1'" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import tensorflow as tf\n", - "tf.__version__" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] } ], "metadata": {