Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于buffer数据处理方式的疑问 #15

Open
linshuxi opened this issue Sep 27, 2023 · 1 comment
Open

关于buffer数据处理方式的疑问 #15

linshuxi opened this issue Sep 27, 2023 · 1 comment

Comments

@linshuxi
Copy link

您好,非常感谢您提供的源码,学到了很多。在buffer的处理中,有这样一段代码,它先将数据transpose成(1,2,0,...)格式,然后又做了一个reshape的行为。请问transpose这个数据步骤是必要的吗?我做了一个实验,发现直接将数据进行reshape操作,不进行transpose的动作,对结果没有什么影响。我猜测您是希望打乱数据,不知道这种想法对不对。

 @staticmethod
    def _cast(x: np.ndarray):
        return x.transpose(1, 2, 0, *range(3, x.ndim)).reshape(-1, *x.shape[3:])
@ASh-en
Copy link

ASh-en commented Apr 24, 2024

我这用obs尝试说说我是怎么理解为什么要这个操作的:

# obs初始化结构维度依次是时间步,环境,智能体,然后接基本状态S的形状
self.obs = np.zeros((self.buffer_size + 1, self.n_rollout_threads, self.num_agents, *obs_shape), dtype=np.float32)
# 经过函数_cast()操作后,得到的是一个以S为基本元素的列表
obs = ReplayBuffer._cast(buf.obs# 也就是obs=[S_1,S_2,S_3,........,S_n]
#这里的相邻的两个S_1,S_2大概率(只有reshape降维度前分属不同维度的部分不是)是同一个环境下的同一个智能体的两个连续时间步的状态。
# 而如果不进行transpose,这里的两个S_1,S_2大概率是同一个时间步下的同一个环境的两个连续智能体的状态,也就是说此时的两个状态间是没有时间相关性的。
# 这样的话,按照data_chunk_length长度取出来的一个chunk间也是没有时间相关性的,后面进行的rnn训练过程也就没有理论依据了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants