{
  "nbformat": 4,
  "nbformat_minor": 0,
  "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"
    },
    "colab": {
      "name": "Reinforcement Learning.ipynb",
      "provenance": []
    }
  },
  "cells": [
    {
      "cell_type": "code",
      "metadata": {
        "id": "mJZ-zp4HNUSS"
      },
      "source": [
        "import numpy as np\n",
        "import gym\n",
        "\n",
        "from keras.models import Sequential\n",
        "from keras.layers import Dense, Activation, Flatten\n",
        "from keras.optimizers import Adam\n",
        "\n",
        "from rl.agents.cem import CEMAgent\n",
        "from rl.memory import EpisodeParameterMemory\n",
        "\n",
        "import matplotlib.pyplot as plt\n",
        "%matplotlib inline\n",
        "from IPython import display\n",
        "\n",
        "import gym\n",
        "from IPython import display\n",
        "import matplotlib\n",
        "import matplotlib.pyplot as plt\n",
        "%matplotlib inline\n",
        "\n",
        "ENV_NAME = 'CartPole-v0'\n",
        "\n",
        "\n",
        "# Get the environment and extract the number of actions.\n",
        "env = gym.make(ENV_NAME)\n",
        "np.random.seed(123)\n",
        "env.seed(123)\n",
        "\n",
        "nb_actions = env.action_space.n\n",
        "obs_dim = env.observation_space.shape[0]\n",
        "\n",
        "# Option 1 : Simple model\n",
        "model = Sequential()\n",
        "model.add(Flatten(input_shape=(1,) + env.observation_space.shape))\n",
        "model.add(Dense(nb_actions))\n",
        "model.add(Activation('softmax'))"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "9fk6r1P4NUSY",
        "outputId": "dbd45cc0-993e-49f0-9dcb-cbaf0a441107"
      },
      "source": [
        "env.observation_space"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "Box(-3.4028234663852886e+38, 3.4028234663852886e+38, (4,), float32)"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 36
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "8d6VzTncNUSa",
        "outputId": "88331513-f416-4b02-ccb7-69aa0a0e7730"
      },
      "source": [
        "import matplotlib.pyplot as plt\n",
        "%matplotlib inline\n",
        "from IPython import display\n",
        "\n",
        "import gym\n",
        "from IPython import display\n",
        "import matplotlib\n",
        "import matplotlib.pyplot as plt\n",
        "%matplotlib inline\n",
        "\n",
        "env = gym.make('Breakout-v0')\n",
        "env.reset()\n",
        "img = plt.imshow(env.render(mode='rgb_array')) # only call this once\n",
        "for _ in range(500):\n",
        "    img.set_data(env.render(mode='rgb_array')) # just update the data\n",
        "    display.display(plt.gcf())\n",
        "    display.clear_output(wait=True)\n",
        "    action = env.action_space.sample()\n",
        "    env.step(action)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "iGtBYOwxNUSa"
      },
      "source": [
        "model = Sequential()\n",
        "model.add(Flatten(input_shape=(1,) + env.observation_space.shape))\n",
        "model.add(Dense(128))\n",
        "model.add(Activation('relu'))\n",
        "model.add(Dense(128))\n",
        "model.add(Activation('relu'))\n",
        "model.add(Dense(128))\n",
        "model.add(Activation('relu'))\n",
        "model.add(Dense(nb_actions))\n",
        "model.add(Activation('softmax'))"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "nhs69StpNUSb",
        "outputId": "71137712-f1b5-4e20-a5cd-c768d2385f52"
      },
      "source": [
        "print(model.summary())\n"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Model: \"sequential_5\"\n",
            "_________________________________________________________________\n",
            "Layer (type)                 Output Shape              Param #   \n",
            "=================================================================\n",
            "flatten_5 (Flatten)          (None, 4)                 0         \n",
            "_________________________________________________________________\n",
            "dense_8 (Dense)              (None, 2)                 10        \n",
            "_________________________________________________________________\n",
            "activation_8 (Activation)    (None, 2)                 0         \n",
            "=================================================================\n",
            "Total params: 10\n",
            "Trainable params: 10\n",
            "Non-trainable params: 0\n",
            "_________________________________________________________________\n",
            "None\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "MbsWSuf8NUSb"
      },
      "source": [
        "\n",
        "# Finally, we configure and compile our agent. You can use every built-in Keras optimizer and\n",
        "# even the metrics!\n",
        "memory = EpisodeParameterMemory(limit=1000, window_length=1)\n",
        "\n",
        "cem = CEMAgent(model=model, nb_actions=nb_actions, memory=memory,\n",
        "               batch_size=50, nb_steps_warmup=2000, train_interval=50, elite_frac=0.05)\n",
        "cem.compile()\n",
        "\n",
        "cem2 = CEMAgent(model=model, nb_actions=nb_actions, memory=memory,\n",
        "               batch_size=50, nb_steps_warmup=2000, train_interval=50, elite_frac=0.05)\n",
        "cem2.compile()\n"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "QOzrQT1wNUSc",
        "outputId": "f1b62bfc-4515-49ac-f460-6c03aadea3a8"
      },
      "source": [
        "# Okay, now it's time to learn something! We visualize the training here for show, but this\n",
        "# slows down training quite a lot. You can always safely abort the training prematurely using\n",
        "# Ctrl + C.\n",
        "cem.fit(env, nb_steps=50000, visualize=False, verbose=1)\n"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Training for 50000 steps ...\n",
            "Interval 1 (0 steps performed)\n",
            "10000/10000 [==============================] - 45s 4ms/step - reward: 1.0000\n",
            "445 episodes - episode_reward: 22.463 [8.000, 158.000] - mean_best_reward: 63.286\n",
            "\n",
            "Interval 2 (10000 steps performed)\n",
            "10000/10000 [==============================] - 44s 4ms/step - reward: 1.0000\n",
            "380 episodes - episode_reward: 26.303 [9.000, 132.000] - mean_best_reward: 66.812\n",
            "\n",
            "Interval 3 (20000 steps performed)\n",
            "10000/10000 [==============================] - 44s 4ms/step - reward: 1.0000\n",
            "376 episodes - episode_reward: 26.614 [8.000, 198.000] - mean_best_reward: 82.625\n",
            "\n",
            "Interval 4 (30000 steps performed)\n",
            "10000/10000 [==============================] - 44s 4ms/step - reward: 1.0000\n",
            "302 episodes - episode_reward: 32.983 [8.000, 193.000] - mean_best_reward: 84.417\n",
            "\n",
            "Interval 5 (40000 steps performed)\n",
            "10000/10000 [==============================] - 43s 4ms/step - reward: 1.0000\n",
            "done, took 219.327 seconds\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<tensorflow.python.keras.callbacks.History at 0x17eaebb00>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 51
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "oZLhRSu_NUSc"
      },
      "source": [
        ""
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "ZqtmxwbbNUSc",
        "outputId": "0e29bc09-be0e-4d6c-d027-21b9e9bd3645"
      },
      "source": [
        "\n",
        "# After training is done, we save the best weights.\n",
        "cem.save_weights('cem_{}_params.h5f'.format(ENV_NAME), overwrite=True)\n",
        "\n",
        "# Finally, evaluate our algorithm for 5 episodes.\n",
        "cem.test(env, nb_episodes=10, visualize=True)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Testing for 10 episodes ...\n",
            "Episode 1: reward: 85.000, steps: 85\n",
            "Episode 2: reward: 59.000, steps: 59\n",
            "Episode 3: reward: 76.000, steps: 76\n",
            "Episode 4: reward: 70.000, steps: 70\n",
            "Episode 5: reward: 91.000, steps: 91\n",
            "Episode 6: reward: 67.000, steps: 67\n",
            "Episode 7: reward: 60.000, steps: 60\n",
            "Episode 8: reward: 80.000, steps: 80\n",
            "Episode 9: reward: 69.000, steps: 69\n",
            "Episode 10: reward: 84.000, steps: 84\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<tensorflow.python.keras.callbacks.History at 0x17d492b00>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 52
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "HrUs97TSNUSd"
      },
      "source": [
        ""
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "yU_Wdd3DNUSd",
        "outputId": "e9820201-442a-4092-e6ad-722f559c2306"
      },
      "source": [
        "cem.fit(env, nb_steps=100, visualize=True, verbose=2)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Training for 100 steps ...\n",
            " 37/100: episode: 1, duration: 0.592s, episode steps: 37, steps per second: 63, episode reward: 37.000, mean reward: 1.000 [1.000, 1.000], mean action: 0.486 [0.000, 1.000], mean observation: -0.119 [-1.087, 0.536], mean_best_reward: --\n",
            " 95/100: episode: 2, duration: 0.984s, episode steps: 58, steps per second: 59, episode reward: 58.000, mean reward: 1.000 [1.000, 1.000], mean action: 0.483 [0.000, 1.000], mean observation: -0.052 [-1.115, 0.641], mean_best_reward: --\n",
            "done, took 1.655 seconds\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<tensorflow.python.keras.callbacks.History at 0x1777a3a20>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 8
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "76HyZjIxNUSd",
        "outputId": "d6da82ca-6e47-4835-f93b-39bb5652886a"
      },
      "source": [
        "cem.test(env, nb_episodes=100, visualize=True)"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Testing for 100 episodes ...\n",
            "Episode 1: reward: 29.000, steps: 29\n",
            "Episode 2: reward: 26.000, steps: 26\n",
            "Episode 3: reward: 41.000, steps: 41\n",
            "Episode 4: reward: 61.000, steps: 61\n",
            "Episode 5: reward: 46.000, steps: 46\n",
            "Episode 6: reward: 39.000, steps: 39\n",
            "Episode 7: reward: 56.000, steps: 56\n",
            "Episode 8: reward: 60.000, steps: 60\n",
            "Episode 9: reward: 51.000, steps: 51\n",
            "Episode 10: reward: 62.000, steps: 62\n",
            "Episode 11: reward: 29.000, steps: 29\n",
            "Episode 12: reward: 26.000, steps: 26\n",
            "Episode 13: reward: 26.000, steps: 26\n",
            "Episode 14: reward: 36.000, steps: 36\n",
            "Episode 15: reward: 53.000, steps: 53\n",
            "Episode 16: reward: 28.000, steps: 28\n",
            "Episode 17: reward: 25.000, steps: 25\n",
            "Episode 18: reward: 49.000, steps: 49\n",
            "Episode 19: reward: 26.000, steps: 26\n",
            "Episode 20: reward: 33.000, steps: 33\n",
            "Episode 21: reward: 29.000, steps: 29\n",
            "Episode 22: reward: 49.000, steps: 49\n",
            "Episode 23: reward: 37.000, steps: 37\n",
            "Episode 24: reward: 47.000, steps: 47\n",
            "Episode 25: reward: 70.000, steps: 70\n",
            "Episode 26: reward: 38.000, steps: 38\n",
            "Episode 27: reward: 27.000, steps: 27\n",
            "Episode 28: reward: 26.000, steps: 26\n",
            "Episode 29: reward: 31.000, steps: 31\n",
            "Episode 30: reward: 40.000, steps: 40\n",
            "Episode 31: reward: 49.000, steps: 49\n",
            "Episode 32: reward: 49.000, steps: 49\n",
            "Episode 33: reward: 76.000, steps: 76\n",
            "Episode 34: reward: 64.000, steps: 64\n",
            "Episode 35: reward: 75.000, steps: 75\n",
            "Episode 36: reward: 43.000, steps: 43\n",
            "Episode 37: reward: 25.000, steps: 25\n",
            "Episode 38: reward: 36.000, steps: 36\n",
            "Episode 39: reward: 75.000, steps: 75\n",
            "Episode 40: reward: 28.000, steps: 28\n",
            "Episode 41: reward: 53.000, steps: 53\n",
            "Episode 42: reward: 36.000, steps: 36\n",
            "Episode 43: reward: 27.000, steps: 27\n",
            "Episode 44: reward: 26.000, steps: 26\n",
            "Episode 45: reward: 57.000, steps: 57\n",
            "Episode 46: reward: 33.000, steps: 33\n",
            "Episode 47: reward: 63.000, steps: 63\n",
            "Episode 48: reward: 31.000, steps: 31\n",
            "Episode 49: reward: 25.000, steps: 25\n",
            "Episode 50: reward: 32.000, steps: 32\n",
            "Episode 51: reward: 28.000, steps: 28\n",
            "Episode 52: reward: 56.000, steps: 56\n",
            "Episode 53: reward: 39.000, steps: 39\n",
            "Episode 54: reward: 73.000, steps: 73\n",
            "Episode 55: reward: 40.000, steps: 40\n",
            "Episode 56: reward: 57.000, steps: 57\n",
            "Episode 57: reward: 33.000, steps: 33\n",
            "Episode 58: reward: 54.000, steps: 54\n",
            "Episode 59: reward: 40.000, steps: 40\n",
            "Episode 60: reward: 36.000, steps: 36\n",
            "Episode 61: reward: 27.000, steps: 27\n",
            "Episode 62: reward: 73.000, steps: 73\n",
            "Episode 63: reward: 24.000, steps: 24\n",
            "Episode 64: reward: 37.000, steps: 37\n",
            "Episode 65: reward: 40.000, steps: 40\n",
            "Episode 66: reward: 28.000, steps: 28\n",
            "Episode 67: reward: 42.000, steps: 42\n",
            "Episode 68: reward: 38.000, steps: 38\n",
            "Episode 69: reward: 28.000, steps: 28\n",
            "Episode 70: reward: 36.000, steps: 36\n",
            "Episode 71: reward: 39.000, steps: 39\n",
            "Episode 72: reward: 34.000, steps: 34\n",
            "Episode 73: reward: 42.000, steps: 42\n",
            "Episode 74: reward: 82.000, steps: 82\n",
            "Episode 75: reward: 29.000, steps: 29\n",
            "Episode 76: reward: 57.000, steps: 57\n",
            "Episode 77: reward: 28.000, steps: 28\n",
            "Episode 78: reward: 28.000, steps: 28\n",
            "Episode 79: reward: 74.000, steps: 74\n",
            "Episode 80: reward: 27.000, steps: 27\n",
            "Episode 81: reward: 66.000, steps: 66\n",
            "Episode 82: reward: 46.000, steps: 46\n",
            "Episode 83: reward: 33.000, steps: 33\n",
            "Episode 84: reward: 25.000, steps: 25\n",
            "Episode 85: reward: 64.000, steps: 64\n",
            "Episode 86: reward: 25.000, steps: 25\n",
            "Episode 87: reward: 31.000, steps: 31\n",
            "Episode 88: reward: 31.000, steps: 31\n",
            "Episode 89: reward: 51.000, steps: 51\n",
            "Episode 90: reward: 37.000, steps: 37\n",
            "Episode 91: reward: 42.000, steps: 42\n",
            "Episode 92: reward: 29.000, steps: 29\n",
            "Episode 93: reward: 63.000, steps: 63\n",
            "Episode 94: reward: 68.000, steps: 68\n",
            "Episode 95: reward: 46.000, steps: 46\n",
            "Episode 96: reward: 44.000, steps: 44\n",
            "Episode 97: reward: 24.000, steps: 24\n",
            "Episode 98: reward: 67.000, steps: 67\n",
            "Episode 99: reward: 41.000, steps: 41\n",
            "Episode 100: reward: 61.000, steps: 61\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<tensorflow.python.keras.callbacks.History at 0x17d302d30>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 14
        }
      ]
    }
  ]
}