python - Tensorflow 环境在 python 中工作,但是当我将它转换为 tf 环境时,step 函数什么也不做
问题描述
我正在尝试使用 tensorflow 和强化学习来连接 4 AI。我为它创建了一个 python 环境,它工作正常,但是当我将它转换为 tensorflow 环境(我必须为 Q-network 工作)时,step 函数什么也不做。
这是我的环境:
class ConnectFour(py_environment.PyEnvironment):
def __init__(self):
self._action_spec = array_spec.BoundedArraySpec(
shape=(), dtype=np.int32, minimum=0, maximum=5, name='action')
self._observation_spec = array_spec.ArraySpec(
shape=(1,7,6,3), dtype=np.int32, name='observation')
self._state = get_empty_board()
self._episode_ended = False
self.moves_played = 0
def action_spec(self):
return self._action_spec
def observation_spec(self):
return self._observation_spec
def _reset(self):
self.moves_played = 0
self._state = get_empty_board()
self._episode_ended = False
return ts.restart(np.array([self._state], dtype=np.int32))
def _step(self, action):
if self._episode_ended:
return self.reset()
i = 0
while i < 7 and self._state[i][action][0] == 1:
i += 1
if i == 0:
i += 1
#return False
self._state[i - 1][action][0] = 0
self._state[i - 1][action][1] = 1
self.moves_played += 1
res = game_over(self._state)
if res != 0:
self._episode_ended = True
if res == 1:
return ts.termination(np.array([self._state], dtype=np.int32), 1)
if res == 2:
return ts.termination(np.array([self._state], dtype=np.int32), -1)
if self.moves_played >= 42:
self._episode_ended = True
return ts.termination(np.array([self._state], dtype=np.int32), 0)
return ts.transition(
np.array([self._state], dtype=np.int32), reward=0.0, discount=1.0)
我的设置是 7x6 棋盘是一个 3D 数组,棋盘中的每个单元格都是一个向量,表示谁在那里玩过((1,0,0)代表空,(0,1,0)代表玩家 1,(0, 0,1) 对于玩家 2)。
例如,如果我尝试:
train_py_env = ConnectFour()
time_step = train_py_env.reset()
time_step = train_py_env(2)
那么结果是正确的(玩家1在第二列玩)。
但如果我尝试:
train_env = tf_py_environment.TFPyEnvironment(train_py_env)
time_step = train_env.reset()
time_step = train_env(2)
然后程序不会崩溃,电路板已正确初始化但没有任何反应。我尝试过调试,问题似乎是由于某种原因,当环境转换为 tensorflow 环境时,修改self._state
(例如self._state[i - 1][action][0] = 0
)的行没有做任何事情。
解决方案
推荐阅读
- c# - 如何检查装箱值是否为默认值
- php - 计算两个日期之间的工作日
- marklogic - 关闭引导主机导致 Marklogic 中的整个集群关闭
- mysql - MySQL Error 1064: You have an error in your SQL syntax
- encoding - 用于大量小数位的类型的 TCL 编码
- java - Google Play Developer API - 应用内更新优先级不起作用
- django - 我已经在 apache 服务器中部署了我的 Django 应用程序。所有静态文件都得到正确服务,但它不接受来自表单输入的媒体文件
- angular - 依次调用 Observable.subscribe()
- c# - EPPLUS 没有清楚地识别 RichText 属性
- react-native - 如何摆脱默认的白色启动由 ios 中的 react-native 屏幕提供支持?