Игры OpenAI Gym Atari, приложение TD Policy - PullRequest
0 голосов
/ 25 февраля 2019

Могу ли я применить политику TD к таким средам?Или только такие методы, как DQN и почему?

Я пытаюсь применить оценку политики TD к симуляторам игр Atari в Python в Gym, и я немного новичок в этом.У меня есть этот класс значения:

class V_Class():  
""" Class to store the state Value function
    V(s) = expected future discounted reward from s onwards (the return Gt)
    Stores it as a dictionnary and adds states as encounteded (get method)
    Two methods: get and set
"""
def __init__(self):       
    self.f = {}

def get(self, s):        
    if(s not in self.f):
        self.f[s] = 0             
    return self.f[s]

def set(self, s, y):
    self.f[s] = y  

, и у меня есть эта реализация:

env = Environment.Environment("SpaceInvaders-v0")
V = V_Class()

iepisode = 0
while iepisode <= 1:
    obs = env.reset()
    done = False
    SUMREWARD=0
    while not done:
        print("obs:", obs)
        action = env.action_space.sample()
        new_obs, reward, done, info = env.step(action)
        SUMREWARD+=reward
        new_Vs = V.get(obs) + 0.7*(reward + 0.5*V.get(new_obs) - V.get(obs)) 
        V.set(obs,new_Vs)
        obs = new_obs

, но я получаю эту ошибку:

TypeError: unhashable type: 'numpy.ndarray'  as you can see here:

>  TypeError             Traceback (most recent call
> last) <ipython-input-12-428939358367> in <module>
>      12         new_obs, reward, done, info = env.step(action)
>      13         SUMREWARD+=reward
> ---> 14         new_Vs = V.get(obs) + 0.7*(reward + 0.5*V.get(new_obs) - V.get(obs))
>      15         V.set(obs,new_Vs)
>      16         obs = new_obs
> 
> <ipython-input-4-5d3d077cd162> in get(self, s)
>       9 
>      10     def get(self, s):
> ---> 11         if(s not in self.f):
>      12             self.f[s] = 0
>      13         return self.f[s]
> 
> TypeError: unhashable type: 'numpy.ndarray'

Поскольку этот класс V былПервоначально сделано для классических сред, где состояния (переменная obs) представляют собой отдельные числа, в то время как окружения Atari имеют большие трехмерные numpy.ndarray, представляющие состояния.

V класс здесь должен проверить в своем словаре f, имеет ли это состояние уже сохраненное значение, и если не сохранять значение для него на основе формулы:

new_Vs = V.get(obs) + 0.7*(reward + 0.5*V.get(new_obs) - V.get(obs))

Как бы вы предложили мне это исправить?Есть ли процесс, который я не знаю, которому я должен следовать в таких случаях, или мне просто нужно обновить методы V-класса для хранения больших состояний в качестве ключа словаря?

1 Ответ

0 голосов
/ 13 марта 2019

Вы пытаетесь выполнить поиск в словаре (f) с пустым массивом (obs) в качестве ключа, как в этом примере:

import numpy as np
array = np.ndarray([1,2,3])
dict = {}
if array not in dict:
    print("Its not")
else:
    print("Its in")

, который возвращает ту же ошибку:

TypeError: unhashable type: 'numpy.ndarray'

Вы должны использовать в качестве ключа хешируемый тип, а не массив.

...