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:  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