Tf代理环境示例中_observation_spec和_action_spec的形状



在TF Agents Environments的tensorflow文档中,有一个简单(受21点启发(纸牌游戏的环境示例。

init如下所示:

class CardGameEnv(py_environment.PyEnvironment):
def __init__(self):
self._action_spec = array_spec.BoundedArraySpec(
shape=(), dtype=np.int32, minimum=0, maximum=1, name='action')
self._observation_spec = array_spec.BoundedArraySpec(
shape=(1,), dtype=np.int32, minimum=0, name='observation')
self._state = 0
self._episode_ended = False

动作规范只允许0(不要索要卡片(或1(索要卡片(,因此形状为shape=()(只需要一个整数(是合理的。

然而,我不太理解shape=(1,)的观察规范形状,因为它只代表当前一轮中卡片的总和(因此也是一个整数(。

是什么解释了形状的差异?

一开始我以为它们是一样的。为了测试它们,我在W3 Schools Python上运行了以下代码;尝试编辑器"(我通过这个链接访问它(:

import numpy as np
arr1 = np.zeros((), dtype=np.int32)
arr2 = np.zeros((1), dtype=np.int32)
print("This is the first array:", arr1, "n")
print("This is the second array:", arr2, "n")

我得到的结果是:

This is the first array: 0
This is the second array: [0] 

这使我得出结论,shape=()是一个简单的整数,被视为0-D数组,但shape=(1,)是一个由单个整数组成的1-D数组。我希望这是准确的,因为我想自己确认一下。在第二次测试中进一步检查:

import numpy as np
arr1 = np.array(42)
arr2 = np.array([1])
arr3 = np.array([1, 2, 3, 4])
print(arr1.shape)
print(arr2.shape)
print(arr3.shape)

输出为:

()
(1,)
(4,)

这似乎证实了我首先得出的结论,因为arr1是一个0-D数组,arr3是一个由4个元素组成的1-D数组(如W3学校教程中所解释的(,数组arr2的形状与arr3相似,但元素数量不同。

至于为什么动作和观测分别表示为整数和一个元素的数组,这可能是因为TensorFlow使用张量(n维数组(工作,并且将观测视为数组可能更容易进行计算。

该操作被声明为一个整数,可能是为了简化_step()函数内部的流程,因为使用if/elif/else结构的数组会有点乏味。还有其他具有更多元素和离散/连续值的action_spec示例,因此不会想到其他示例。

我真的不确定所有这些都是对的,但似乎至少可以开始讨论。

相关内容

  • 没有找到相关文章