From dc1f4d9e6bd12fbb54a7e47e5b301c08c3d8e834 Mon Sep 17 00:00:00 2001 From: Anuradha Weeraman Date: Mon, 17 Dec 2018 23:03:44 -0500 Subject: [PATCH] Initial commit --- README.md | 119 +++++++++++++++++++++++++++++++++++ bananas.py | 116 ++++++++++++++++++++++++++++++++++ dqn_agent.py | 158 +++++++++++++++++++++++++++++++++++++++++++++++ graph.png | Bin 0 -> 38759 bytes model.py | 28 +++++++++ requirements.txt | 16 +++++ weights.pth | Bin 0 -> 10624 bytes 7 files changed, 437 insertions(+) create mode 100644 README.md create mode 100644 bananas.py create mode 100644 dqn_agent.py create mode 100644 graph.png create mode 100644 model.py create mode 100644 requirements.txt create mode 100644 weights.pth diff --git a/README.md b/README.md new file mode 100644 index 0000000..20fa8ad --- /dev/null +++ b/README.md @@ -0,0 +1,119 @@ +# Udacity Deep Reinforcement Learning Nanodegree Project: Navigation + +This is a project that uses Deep Q-Networks to train an agent to capture yellow bananas and avoid +blue bananas through deep reinforcement learning in a Unity ML-Agents environment. + +The steps below will describe how to get this running on Linux/MacOS: + +## 1. Clone the repo + +``` +$ git clone https://github.com/aweeraman/deep-q-networks-navigation +``` + +## 2. Install Python & dependencies + +Using the Anaconda distribution, create a new python runtime and install the required dependencies: + +``` +$ conda create -n dqn python=3.6 +$ source activate dqn +$ pip install -r requirements.txt +``` + +## 3. Install the Unity Environment + +Download a pre-built environment to run the agent. You will not need to install Unity for this. The +environment is OS specific, so the correct version for the operating system must be downloaded. + +For MacOS, [use this link](https://s3-us-west-1.amazonaws.com/udacity-drlnd/P1/Banana/Banana.app.zip) + +After uncompressing, there should be a directory called "Banana.app" in the root directory of the repository. + +## 4. Run the agent + +To run the pre-trained agent, execute the following: + +``` +$ python bananas.py --run +Mono path[0] = '/Users/anuradha/ninsei/udacity/bananas/Banana.app/Contents/Resources/Data/Managed' +Mono config path = '/Users/anuradha/ninsei/udacity/bananas/Banana.app/Contents/MonoBleedingEdge/etc' +INFO:unityagents: +'Academy' started successfully! +Unity Academy name: Academy + Number of Brains: 1 + Number of External Brains : 1 + Lesson number : 0 + Reset Parameters : + +Unity brain name: BananaBrain + Number of Visual Observations (per agent): 0 + Vector Observation space type: continuous + Vector Observation space size (per agent): 37 + Number of stacked Vector Observation: 1 + Vector Action space type: discrete + Vector Action space size (per agent): 4 + Vector Action descriptions: , , , +Number of agents: 1 +Number of actions: 4 +States look like: [1. 0. 0. 0. 0.84408134 0. + 0. 1. 0. 0.0748472 0. 1. + 0. 0. 0.25755 1. 0. 0. + 0. 0.74177343 0. 1. 0. 0. + 0.25854847 0. 0. 1. 0. 0.09355672 + 0. 1. 0. 0. 0.31969345 0. + 0. ] +States have length: 37 +Score: 15.0 +``` + +To customize hyperparameters and train the agent, execute the following: + +``` +$ python bananas.py --train +(drl) sendai:bananas anuradha$ python bananas.py --train +Mono path[0] = '/Users/anuradha/ninsei/udacity/bananas/Banana.app/Contents/Resources/Data/Managed' +Mono config path = '/Users/anuradha/ninsei/udacity/bananas/Banana.app/Contents/MonoBleedingEdge/etc' +INFO:unityagents: +'Academy' started successfully! +Unity Academy name: Academy + Number of Brains: 1 + Number of External Brains : 1 + Lesson number : 0 + Reset Parameters : + +Unity brain name: BananaBrain + Number of Visual Observations (per agent): 0 + Vector Observation space type: continuous + Vector Observation space size (per agent): 37 + Number of stacked Vector Observation: 1 + Vector Action space type: discrete + Vector Action space size (per agent): 4 + Vector Action descriptions: , , , +Number of agents: 1 +Number of actions: 4 +Episode 100 Average Score: 0.785 +Episode 200 Average Score: 4.03 +Episode 300 Average Score: 7.21 +Episode 400 Average Score: 9.00 +Episode 500 Average Score: 11.44 +Episode 600 Average Score: 13.50 +Episode 700 Average Score: 15.07 +Episode 800 Average Score: 15.16 +Episode 900 Average Score: 15.90 +Episode 1000 Average Score: 16.83 +``` + +# Troubleshooting + +If you run into an error such as the following when training the agent: + +``` +ImportError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends. If you are using (Ana)Conda please install python.app and replace the use of 'python' with 'pythonw'. See 'Working with Matplotlib on OSX' in the Matplotlib FAQ for more information. +``` + +Modify ~/.matplotlib/matplotlibrc and add the following line: + +``` +backend: TkAgg +``` diff --git a/bananas.py b/bananas.py new file mode 100644 index 0000000..b8a63bf --- /dev/null +++ b/bananas.py @@ -0,0 +1,116 @@ +from unityagents import UnityEnvironment +import numpy as np +import torch +import random +import argparse +import random +from dqn_agent import Agent +from collections import deque +import matplotlib.pyplot as plt + +# https://github.com/udacity/deep-reinforcement-learning/blob/master/dqn/solution/Deep_Q_Network_Solution.ipynb +def dqn(n_episodes=1000, max_t=1000, eps_start=1.0, eps_end=0.01, eps_decay=0.995): + """Deep Q-Learning. + + Params + ====== + n_episodes (int): maximum number of training episodes + max_t (int): maximum number of timesteps per episode + eps_start (float): starting value of epsilon, for epsilon-greedy action selection + eps_end (float): minimum value of epsilon + eps_decay (float): multiplicative factor (per episode) for decreasing epsilon + """ + scores = [] # list containing scores from each episode + scores_window = deque(maxlen=100) # last 100 scores + eps = eps_start # initialize epsilon + for i_episode in range(1, n_episodes+1): + env_info = env.reset(train_mode=True)[brain_name] + state = env_info.vector_observations[0] + score = 0 + for t in range(max_t): + action = agent.act(state, eps) + env_info = env.step(action)[brain_name] + reward = env_info.rewards[0] + next_state = env_info.vector_observations[0] + done = env_info.local_done[0] + score += reward + agent.step(state, action, reward, next_state, done) + state = next_state + if done: + break + scores_window.append(score) # save most recent score + scores.append(score) # save most recent score + eps = max(eps_end, eps_decay*eps) # decrease epsilon + print('\rEpisode {}\tAverage Score: {:.2f}'.format(i_episode, np.mean(scores_window)), end="") + if i_episode % 100 == 0: + print('\rEpisode {}\tAverage Score: {:.2f}'.format(i_episode, np.mean(scores_window))) + torch.save(agent.qnetwork_local.state_dict(), 'weights.pth') + if np.mean(scores_window)>=200.0: + print('\nEnvironment solved in {:d} episodes!\tAverage Score: {:.2f}'.format(i_episode-100, np.mean(scores_window))) + torch.save(agent.qnetwork_local.state_dict(), 'weights.pth') + break + return scores + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='Train an agent to navigate a large world and collect yellow bananas, while avoiding blue bananas using Deep Q-Networks') + parser.add_argument('--train', help='Train the agent', action='store_true') + parser.add_argument('--run', help='Run the agent', action='store_true') + + env = UnityEnvironment(file_name="Banana.app") + + # get the default brain + brain_name = env.brain_names[0] + brain = env.brains[brain_name] + + # reset the environment + env_info = env.reset(train_mode=True)[brain_name] + + # number of agents in the environment + print('Number of agents:', len(env_info.agents)) + + # number of actions + action_size = brain.vector_action_space_size + print('Number of actions:', action_size) + + agent = Agent(state_size=37, action_size=4, seed=0) + + args = parser.parse_args(); + + if args.train: + scores = dqn() + + # plot the scores + fig = plt.figure() + ax = fig.add_subplot(111) + plt.plot(np.arange(len(scores)), scores) + plt.ylabel('Score') + plt.xlabel('Episode #') + plt.show() + + elif args.run: + agent.qnetwork_local.load_state_dict(torch.load('weights.pth')) + + state = env_info.vector_observations[0] + print('States look like:', state) + state_size = len(state) + print('States have length:', state_size) + + env_info = env.reset(train_mode=False)[brain_name] + state = env_info.vector_observations[0] + score = 0 + while True: + action = agent.act(state) + env_info = env.step(action)[brain_name] + next_state = env_info.vector_observations[0] + reward = env_info.rewards[0] + done = env_info.local_done[0] + score += reward + state = next_state + if done: + break + + print("Score: {}".format(score)) + env.close() + + else: + parser.print_help() diff --git a/dqn_agent.py b/dqn_agent.py new file mode 100644 index 0000000..5f94bab --- /dev/null +++ b/dqn_agent.py @@ -0,0 +1,158 @@ +import numpy as np +import random +from collections import namedtuple, deque + +from model import QNetwork + +import torch +import torch.nn.functional as F +import torch.optim as optim + +BUFFER_SIZE = int(1e5) # replay buffer size +BATCH_SIZE = 64 # minibatch size +GAMMA = 0.99 # discount factor +TAU = 1e-3 # for soft update of target parameters +LR = 5e-4 # learning rate +UPDATE_EVERY = 4 # how often to update the network + +device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") + +class Agent(): + """Interacts with and learns from the environment.""" + + def __init__(self, state_size, action_size, seed): + """Initialize an Agent object. + + Params + ====== + state_size (int): dimension of each state + action_size (int): dimension of each action + seed (int): random seed + """ + self.state_size = state_size + self.action_size = action_size + self.seed = random.seed(seed) + + # Q-Network + self.qnetwork_local = QNetwork(state_size, action_size, seed).to(device) + self.qnetwork_target = QNetwork(state_size, action_size, seed).to(device) + self.optimizer = optim.Adam(self.qnetwork_local.parameters(), lr=LR) + + # Replay memory + self.memory = ReplayBuffer(action_size, BUFFER_SIZE, BATCH_SIZE, seed) + # Initialize time step (for updating every UPDATE_EVERY steps) + self.t_step = 0 + + def step(self, state, action, reward, next_state, done): + # Save experience in replay memory + self.memory.add(state, action, reward, next_state, done) + + # Learn every UPDATE_EVERY time steps. + self.t_step = (self.t_step + 1) % UPDATE_EVERY + if self.t_step == 0: + # If enough samples are available in memory, get random subset and learn + if len(self.memory) > BATCH_SIZE: + experiences = self.memory.sample() + self.learn(experiences, GAMMA) + + def act(self, state, eps=0.): + """Returns actions for given state as per current policy. + + Params + ====== + state (array_like): current state + eps (float): epsilon, for epsilon-greedy action selection + """ + state = torch.from_numpy(state).float().unsqueeze(0).to(device) + self.qnetwork_local.eval() + with torch.no_grad(): + action_values = self.qnetwork_local(state) + self.qnetwork_local.train() + + # Epsilon-greedy action selection + if random.random() > eps: + return np.argmax(action_values.cpu().data.numpy()) + else: + return random.choice(np.arange(self.action_size)) + + def learn(self, experiences, gamma): + """Update value parameters using given batch of experience tuples. + + Params + ====== + experiences (Tuple[torch.Tensor]): tuple of (s, a, r, s', done) tuples + gamma (float): discount factor + """ + states, actions, rewards, next_states, dones = experiences + + # Get max predicted Q values (for next states) from target model + Q_targets_next = self.qnetwork_target(next_states).detach().max(1)[0].unsqueeze(1) + # Compute Q targets for current states + Q_targets = rewards + (gamma * Q_targets_next * (1 - dones)) + + # Get expected Q values from local model + Q_expected = self.qnetwork_local(states).gather(1, actions) + + # Compute loss + loss = F.mse_loss(Q_expected, Q_targets) + # Minimize the loss + self.optimizer.zero_grad() + loss.backward() + self.optimizer.step() + + # ------------------- update target network ------------------- # + self.soft_update(self.qnetwork_local, self.qnetwork_target, TAU) + + def soft_update(self, local_model, target_model, tau): + """Soft update model parameters. + θ_target = τ*θ_local + (1 - τ)*θ_target + + Params + ====== + local_model (PyTorch model): weights will be copied from + target_model (PyTorch model): weights will be copied to + tau (float): interpolation parameter + """ + for target_param, local_param in zip(target_model.parameters(), local_model.parameters()): + target_param.data.copy_(tau*local_param.data + (1.0-tau)*target_param.data) + + +class ReplayBuffer: + """Fixed-size buffer to store experience tuples.""" + + def __init__(self, action_size, buffer_size, batch_size, seed): + """Initialize a ReplayBuffer object. + + Params + ====== + action_size (int): dimension of each action + buffer_size (int): maximum size of buffer + batch_size (int): size of each training batch + seed (int): random seed + """ + self.action_size = action_size + self.memory = deque(maxlen=buffer_size) + self.batch_size = batch_size + self.experience = namedtuple("Experience", field_names=["state", "action", "reward", "next_state", "done"]) + self.seed = random.seed(seed) + + def add(self, state, action, reward, next_state, done): + """Add a new experience to memory.""" + e = self.experience(state, action, reward, next_state, done) + self.memory.append(e) + + def sample(self): + """Randomly sample a batch of experiences from memory.""" + experiences = random.sample(self.memory, k=self.batch_size) + + states = torch.from_numpy(np.vstack([e.state for e in experiences if e is not None])).float().to(device) + actions = torch.from_numpy(np.vstack([e.action for e in experiences if e is not None])).long().to(device) + rewards = torch.from_numpy(np.vstack([e.reward for e in experiences if e is not None])).float().to(device) + next_states = torch.from_numpy(np.vstack([e.next_state for e in experiences if e is not None])).float().to(device) + dones = torch.from_numpy(np.vstack([e.done for e in experiences if e is not None]).astype(np.uint8)).float().to(device) + + return (states, actions, rewards, next_states, dones) + + def __len__(self): + """Return the current size of internal memory.""" + return len(self.memory) diff --git a/graph.png b/graph.png new file mode 100644 index 0000000000000000000000000000000000000000..df692be3305f8e141918b704d2d18fc66dab08a0 GIT binary patch literal 38759 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

pOek!D^Q_1A} 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 literal 0 HcmV?d00001 diff --git a/model.py b/model.py new file mode 100644 index 0000000..96e84e1 --- /dev/null +++ b/model.py @@ -0,0 +1,28 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F + +class QNetwork(nn.Module): + """Actor (Policy) Model.""" + + def __init__(self, state_size, action_size, seed, fc1_units=32, fc2_units=32): + """Initialize parameters and build model. + Params + ====== + state_size (int): Dimension of each state + action_size (int): Dimension of each action + seed (int): Random seed + fc1_units (int): Number of nodes in first hidden layer + fc2_units (int): Number of nodes in second hidden layer + """ + super(QNetwork, self).__init__() + self.seed = torch.manual_seed(seed) + self.fc1 = nn.Linear(state_size, fc1_units) + self.fc2 = nn.Linear(fc1_units, fc2_units) + self.fc3 = nn.Linear(fc2_units, action_size) + + def forward(self, state): + """Build a network that maps state -> action values.""" + x = F.relu(self.fc1(state)) + x = F.relu(self.fc2(x)) + return self.fc3(x) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..b5e952a --- /dev/null +++ b/requirements.txt @@ -0,0 +1,16 @@ +tensorflow==1.7.1 +Pillow>=4.2.1 +matplotlib +numpy>=1.11.0 +jupyter +pytest>=3.2.2 +docopt +pyyaml +protobuf==3.5.2 +grpcio==1.11.0 +torch==0.4.0 +pandas +scipy +ipykernel +argparse +unityagents diff --git a/weights.pth b/weights.pth new file mode 100644 index 0000000000000000000000000000000000000000..a6453d50129d99a63e302b56fff789091f312548 GIT binary patch literal 10624 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 a&nEuga*&krmoD6>mVkBBXQ6Z}!~X{m!W~Kg literal 0 HcmV?d00001