From f89b634832f50dd903f27b3da5d953f1ba1732d2 Mon Sep 17 00:00:00 2001
From: oscarchaufour <101994223+oscarchaufour@users.noreply.github.com>
Date: Thu, 22 Feb 2024 17:25:13 +0100
Subject: [PATCH] updates

---
 README.md                    |   3 +
 a2c_sb3_cartpole.py          |  34 +++++++----
 images/reinforce_rewards.png | Bin 0 -> 36534 bytes
 neural_network_model.zip     | Bin 0 -> 6368 bytes
 reinforce_cartpole.py        | 112 +++++++++++++++++++++--------------
 test.ipynb                   |  34 ++++++++++-
 6 files changed, 121 insertions(+), 62 deletions(-)
 create mode 100644 images/reinforce_rewards.png
 create mode 100644 neural_network_model.zip

diff --git a/README.md b/README.md
index f49f3de..29da3e7 100644
--- a/README.md
+++ b/README.md
@@ -3,3 +3,6 @@
 ### Get familiar with Hugging Face Hub
 
 Link to the model on the hub : 
+
+# REINFORCE
+Plot showing the total reward accross episodes: ![Alt text](images/reinforce_rewards.png)
diff --git a/a2c_sb3_cartpole.py b/a2c_sb3_cartpole.py
index ba510f9..3666845 100644
--- a/a2c_sb3_cartpole.py
+++ b/a2c_sb3_cartpole.py
@@ -2,8 +2,15 @@ import gymnasium as gym
 import cv2
 from stable_baselines3 import A2C
 from huggingface_sb3 import package_to_hub, push_to_hub
+from gym import envs
+from gymnasium.envs.registration import register
 
-env = gym.make("CartPole-v1", render_mode="rgb_array")
+env_id = "CartPole-v1"
+
+# Register the environment
+register(id=env_id, entry_point='gym.envs.classic_control:CartPoleEnv', max_episode_steps=500)
+
+env = gym.make(env_id)
 
 model = A2C("MlpPolicy", env, verbose=1)
 model.learn(total_timesteps=10_000)
@@ -18,15 +25,16 @@ for i in range(1000):
     # if done:
     #   obs = vec_env.reset()
 
-if __name__ == "__main__":
-    package_to_hub(model=model, 
-                    model_name="a2c-CartPole-v1",
-                    model_architecture="a2c",
-                    env_id="CartPole-v1",
-                    eval_env=env,
-                    repo_id="oscarchaufour/a2c-CartPole-v1",
-                    commit_message="Test commit")
-        
-    push_to_hub(repo_id="oscarchaufour/a2c-CartPole-v1",
-                filename="a2c_sb3_cartpole.zip",
-                commit_message="Added A2C CartPole model")
\ No newline at end of file
+# Package and push the model to the Hugging Face Hub
+model_package_id = package_to_hub(model=model, 
+                                  model_name="a2c-CartPole-v1",
+                                  model_architecture="a2c",
+                                  env_id=env_id,
+                                  eval_env=env,
+                                  repo_id="oscarchaufour/a2c-CartPole-v1",
+                                  commit_message="Initial commit of A2C CartPole model")
+
+# Push the model package to the Hub
+push_to_hub(repo_id="oscarchaufour/a2c-CartPole-v1",
+            filename=model_package_id + ".zip",
+            commit_message="Added A2C CartPole model")
\ No newline at end of file
diff --git a/images/reinforce_rewards.png b/images/reinforce_rewards.png
new file mode 100644
index 0000000000000000000000000000000000000000..e76d632e17aa3bc917cd5e2de89c865baaeb0bcf
GIT binary patch
literal 36534
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
XZ~E_><1z^b1_lOCS3j3^P6<r_3qyg;

literal 0
HcmV?d00001

diff --git a/neural_network_model.zip b/neural_network_model.zip
new file mode 100644
index 0000000000000000000000000000000000000000..ba6de9a0b83bb0d2cf55768c2497c4f1a0e9345c
GIT binary patch
literal 6368
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

literal 0
HcmV?d00001

diff --git a/reinforce_cartpole.py b/reinforce_cartpole.py
index c732e85..bf5d1bb 100644
--- a/reinforce_cartpole.py
+++ b/reinforce_cartpole.py
@@ -5,6 +5,7 @@ import torch.optim as optim
 import matplotlib.pyplot as plt
 from tqdm import tqdm 
 import numpy as np
+from torch.distributions import Categorical
 
 # Define the neural network model
 class Policy(nn.Module):
@@ -24,77 +25,68 @@ class Policy(nn.Module):
         x = self.softmax(x)
         return x
 
-
-def reinforce():
-    # Create the environment
-    env = gym.make("CartPole-v1")
-
-    # Set up the agent
-    policy = Policy(
-        input_size=env.observation_space.shape[0],
-        output_size=env.action_space.n
-    )
-    optimizer = optim.Adam(policy.parameters(), lr=5e-3)
-
+def reinforce(policy, env, optimizer):
     # Training loop
-    num_episodes = 500
+    num_episodes = 200
     gamma = 0.99
-    episode_rewards = []
+    episodes_rewards = []
 
     for episode in tqdm(range(num_episodes)):
-        action_probabilities = []
-        episode_rewards_weighted = []
-
         # Reset the environment and get the initial observation
-        observation = env.reset()[0]
+        observation = env.reset()
 
+        rewards = []
+        log_probabilities = []
         terminated = False
         episode_reward = 0
-        step = 0
 
         while not terminated:
-            step += 1
             # Compute action probabilities
-            action_probs = policy(torch.FloatTensor(observation).unsqueeze(0))
-
+            observation_array = observation[0] if isinstance(observation, tuple) else observation
+            observation_tensor = torch.FloatTensor(observation_array).unsqueeze(0)
+            action_probabilities = policy(observation_tensor)
+            
+            cat = Categorical(action_probabilities)
             # Sample action based on probabilities and store its probability in the buffer
-            action = torch.multinomial(action_probs, num_samples=1).item()
+            action = cat.sample()
+            log_probability = cat.log_prob(action)
 
             # Step the environment with the action
-            observation, reward, terminated, truncated, info = env.step(action)
+            observation, reward, terminated, _, _ = env.step(action.item())
             env.render()
 
-            # Compute and store the return in the buffer
+            # Compute and store the reward in the buffer
             episode_reward += reward
-            episode_rewards_weighted.append(reward * gamma ** step)
-            #episode_rewards.append(episode_reward)
-
-            # Store the action probabilities
-            action_probabilities.append(action_probs[0][action])
-
-        # Normalize the return
-        # Convert action_probabilities to a tensor with requires_grad=True
-        action_probabilities_tensor = torch.FloatTensor(action_probabilities).requires_grad_(True)
-
-        episode_rewards_tensor = torch.FloatTensor(episode_rewards_weighted)
-        episode_rewards_tensor -= torch.mean(episode_rewards_tensor)
-        episode_rewards_tensor /= torch.std(episode_rewards_tensor)
+            log_probabilities.append(log_probability)
+            rewards.append(reward)
+        
+        episodes_rewards.append(episode_reward)
+
+        # Compute the returns
+        weighted_rewards = 0
+        returns = []
+        for r in rewards[::-1]:
+            weighted_rewards = r + gamma * weighted_rewards
+            returns.insert(0, weighted_rewards)
+        returns = torch.tensor(returns)
+        returns = (returns - returns.mean()) / (returns.std() + 1e-5)
 
         # Compute policy loss
-        log_probs = torch.log(action_probabilities_tensor.squeeze(0))
-        policy_loss = -torch.sum(log_probs * torch.tensor(episode_rewards_weighted))
+        loss = []
+        for log_prob, weighted_rewards in zip(log_probabilities, returns):
+            loss.append(log_prob * weighted_rewards)
+        policy_loss = - torch.cat(loss).sum()
 
         # Update the policy
         optimizer.zero_grad()
         policy_loss.backward()
         optimizer.step()
-        episode_rewards.append(episode_reward)
-    return episode_rewards
+    return episodes_rewards
 
 
-def plot_rewards(episode_rewards):
+def plot_rewards(episodes_rewards):
     # Plot the total reward across episodes
-    plt.plot(episode_rewards)
+    plt.plot(episodes_rewards)
     plt.xlabel('Episode')
     plt.ylabel('Total Reward')
     plt.title('REINFORCE: Total Reward across Episodes')
@@ -102,5 +94,33 @@ def plot_rewards(episode_rewards):
 
 
 if __name__ == "__main__":
-    episode_rewards = reinforce()
-    plot_rewards(episode_rewards)
\ No newline at end of file
+    # Create the environment
+    env = gym.make("CartPole-v1")
+
+    # Set up the agent
+    policy = Policy(
+        input_size=env.observation_space.shape[0],
+        output_size=env.action_space.n
+    )
+    optimizer = optim.Adam(policy.parameters(), lr=5e-3)
+    episodes_rewards = reinforce(policy, env, optimizer)
+    env.close()
+
+    # plot the rewards
+    plot_rewards(episodes_rewards)
+
+
+    # Serialize the model and save it to a .zip file
+    # import pickle
+    # import zipfile
+
+    # Assuming `policy` is your neural network model
+
+    # # Step 1: Serialize the model
+    # model_bytes = pickle.dumps(policy)
+
+    # # Step 2: Create a .zip file containing the serialized model
+    # zip_filename = ".zip"
+    # with zipfile.ZipFile(zip_filename, 'w') as zipf:
+    #     zipf.writestr("model.pkl", model_bytes)
+
diff --git a/test.ipynb b/test.ipynb
index b0249db..8a16e65 100644
--- a/test.ipynb
+++ b/test.ipynb
@@ -708,13 +708,41 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "## Reinforce"
+    "## Upload model to Hugging Face hub"
    ]
   },
   {
-   "cell_type": "markdown",
+   "cell_type": "code",
+   "execution_count": 8,
    "metadata": {},
-   "source": []
+   "outputs": [
+    {
+     "ename": "NameError",
+     "evalue": "name 'model' is not defined",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
+      "Cell \u001b[1;32mIn[8], line 3\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mhuggingface_sb3\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m package_to_hub, push_to_hub\n\u001b[1;32m----> 3\u001b[0m package_to_hub(model\u001b[38;5;241m=\u001b[39m\u001b[43mmodel\u001b[49m, \n\u001b[0;32m      4\u001b[0m                 model_name\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124ma2c-CartPole-v1\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[0;32m      5\u001b[0m                 model_architecture\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124ma2c\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[0;32m      6\u001b[0m                 env_id\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCartPole-v1\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[0;32m      7\u001b[0m                 eval_env\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[0;32m      8\u001b[0m                 repo_id\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moscarchaufour/a2c-CartPole-v1\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[0;32m      9\u001b[0m                 commit_message\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mTest commit\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m     11\u001b[0m push_to_hub(repo_id\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moscarchaufour/a2c-CartPole-v1\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[0;32m     12\u001b[0m             filename\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124ma2c_sb3_cartpole.zip\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[0;32m     13\u001b[0m             commit_message\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAdded A2C CartPole model\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n",
+      "\u001b[1;31mNameError\u001b[0m: name 'model' is not defined"
+     ]
+    }
+   ],
+   "source": [
+    "from huggingface_sb3 import package_to_hub, push_to_hub\n",
+    "\n",
+    "package_to_hub(model=model, \n",
+    "                model_name=\"a2c-CartPole-v1\",\n",
+    "                model_architecture=\"a2c\",\n",
+    "                env_id=\"CartPole-v1\",\n",
+    "                eval_env=None,\n",
+    "                repo_id=\"oscarchaufour/a2c-CartPole-v1\",\n",
+    "                commit_message=\"Test commit\")\n",
+    "    \n",
+    "push_to_hub(repo_id=\"oscarchaufour/a2c-CartPole-v1\",\n",
+    "            filename=\"a2c_sb3_cartpole.zip\",\n",
+    "            commit_message=\"Added A2C CartPole model\")\n"
+   ]
   }
  ],
  "metadata": {
-- 
GitLab