PER arabelleğinden örnekleme
Aracını eğitmek için Öncelikli Deneyim Arabelleği (Prioritized Experience Buffer) sınıfını kullanmadan önce .sample() yöntemini hâlâ uygulaman gerekiyor. Bu yöntem, çekmek istediğin örneğin boyutunu argüman olarak alır ve örneklenen geçişleri tensor olarak, bellek arabelleğindeki indeksleri ve önem ağırlıklarıyla birlikte döndürür.
Ortamında kapasitesi 10 olan bir arabellek, örnekleme yapabilmen için önceden yüklendi.
Bu egzersiz, kursun bir parçasıdır
Python ile Deep Reinforcement Learning
Egzersiz talimatları
- Her bir geçişle ilişkili örnekleme olasılığını hesapla.
- Örnekteki geçişlere karşılık gelen indeksleri çek;
np.random.choice(a, s, p=p), olasılık dizisip'ye göreadizisinden, yerine koymalı olarak boyutusolan bir örnek alır. - Her bir geçişle ilişkili önem ağırlığını hesapla.
Uygulamalı etkileşimli egzersiz
Bu egzersizi bu örnek kodu tamamlayarak deneyin.
def sample(self, batch_size):
priorities = np.array(self.priorities)
# Calculate the sampling probabilities
probabilities = ____ / np.sum(____)
# Draw the indices for the sample
indices = np.random.choice(____)
# Calculate the importance weights
weights = (1 / (len(self.memory) * ____)) ** ____
weights /= np.max(weights)
states, actions, rewards, next_states, dones = zip(*[self.memory[idx] for idx in indices])
weights = [weights[idx] for idx in indices]
states_tensor = torch.tensor(states, dtype=torch.float32)
rewards_tensor = torch.tensor(rewards, dtype=torch.float32)
next_states_tensor = torch.tensor(next_states, dtype=torch.float32)
dones_tensor = torch.tensor(dones, dtype=torch.float32)
weights_tensor = torch.tensor(weights, dtype=torch.float32)
actions_tensor = torch.tensor(actions, dtype=torch.long).unsqueeze(1)
return (states_tensor, actions_tensor, rewards_tensor, next_states_tensor,
dones_tensor, indices, weights_tensor)
PrioritizedReplayBuffer.sample = sample
print("Sampled transitions:\n", buffer.sample(3))