在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示例,因此不会想到其他示例。
我真的不确定所有这些都是对的,但似乎至少可以开始讨论。