首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用tf_agents.environments.TFPyEnvironment将Python环境转换为TF环境时会发生什么更改?

当使用tf_agents.environments.TFPyEnvironment将Python环境转换为TF环境时会发生什么更改?
EN

Stack Overflow用户
提问于 2021-06-29 01:57:46
回答 1查看 197关注 0票数 1

我注意到在使用tf_agents.environments.TFPyEnvironment将Python环境转换为TF环境时发生了一些奇怪的事情,我想问您发生了哪些一般性更改。

要澄清这个问题,请在下面找到我的代码。我希望环境能够模拟(以过于简单的方式)与想要购买水果或蔬菜的客户之间的交互。代理应该了解到,当客户请求水果时,应该执行操作0。

代码语言:javascript
复制
class CustomEnv(py_environment.PyEnvironment):
    
    def __init__(self):
        self._action_spec = array_spec.BoundedArraySpec(
            shape=(), dtype=np.int32, minimum=0, maximum=1)
        self._observation_spec = array_spec.BoundedArraySpec(
        shape=(1,1), dtype=np.int32, minimum=0, maximum=1)
        self._state = [0]
        self._counter = 0
        self._episode_ended = False
        self.dictionary = {0: ["Fruits"], 
                            1: ["Vegetables"]}
    
    def action_spec(self):
        return self._action_spec
    
    def observation_spec(self):
        return self._observation_spec
    
    def _reset(self):
        self._state = [0]
        self._counter = 0
        self._episode_ended = False
        return ts.restart(np.array([self._state], dtype=np.int32))
    
    def preferences(self):
        return np.random.randint(2)
    
    def pickedBasket(self, yes):
        reward = -1.0
        if yes:
            reward = 0.0
        return reward
    
    def _step(self, action):
        if self._episode_ended:
            self._reset()
        
        if self._counter<50:
            self._counter += 1
            
            basket = self.preferences()
            condition = basket in self.dictionary[action]
            reward = self.pickedBasket(condition)
            self._state[0] = basket
            
            if self._counter==50:
                self._episode_ended=True
                return ts.termination(np.array([self._state], 
                                               dtype=np.int32),
                                      reward,
                                      1)
            else:
                return ts.transition(np.array([self._state], 
                                              dtype=np.int32), 
                                     reward, 
                                     discount=1.0)

当我执行下面的代码检查时,一切都正常:

代码语言:javascript
复制
py_env = ContextualMBA()
tf_env = tf_py_environment.TFPyEnvironment(py_env)
time_step = tf_env.reset()
action = 0
next_time_step = tf_env.step(action)

我得到了一个无法理解的类型:行condition = basket in self.dictionary[action]的“numpy.ndarray”,所以我把它改成了condition = basket in self.dictionary[int(action)],它工作得很好。我还想确切地说,即使不添加int部件,它也可以作为Python环境工作。所以我想问一下是什么改变了tf_agents.environments.TFPyEnvironment。我不知道它如何影响操作action的类型,因为它与action_spec或任何东西无关(至少在代码中是直接的)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-27 14:53:24

基本上,tf_agents.environments.TFPyEnvironment是一个在您的Python环境和TF之间工作的转换器。influence不知道它可以选择多少个操作,可以观察和学习哪些数据,或者操作的选择将如何影响您的自定义环境。

您的自定义环境提供了环境的规则,它遵循一些标准,以便TFPyEnvironment能够正确地翻译它,这样TF就可以使用它了。您需要在自定义环境中定义元素和方法,例如:

代码语言:javascript
复制
__init__()
  self._action_spec
  self._observation_spec
_reset()
_step()

我不确定您的怀疑是否来自这样一个事实:您为代理提供了一个action = 0,并且与action_spec无关,代理实际上起了作用。action_spec与您的_step()函数没有关系,这是正确的。step函数采取一些操作,并将其应用于环境。这个动作是如何形状的,才是真正的问题。

问题是您选择了这个值并将其交给了tf_env.step()函数。如果您实际上已通过tf_env.step(agent.policy.action) (或tf_env.step(agent.policy.action.action),有时TF- agent使我感到困惑)将操作的选择委托给代理,则代理将不得不查看您的action_spec定义,以了解环境希望该操作看起来是什么样子。

如果未定义action_spec,代理将不知道在0表示“水果”,1选择“蔬菜”(您想要的)之间选择什么,或者将意外的结果定义为“肉”2,或2瓶水的3,2,因为3可以代表“水瓶”。these需要这些定义,因此它知道您环境的规则。

至于实际的更改以及它们如何处理您的自定义环境代码,我相信通过查看TF库的源代码,您会得到一个更好的想法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68171714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档