商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > 如何判断代码是否使用了滑动窗口及确定其步长

如何判断代码是否使用了滑动窗口及确定其步长

  发布于2026-06-24 阅读(0)

扫一扫,手机访问

该代码确实采用了滑动窗口机制,窗口步长(stride)为1帧,即相邻样本的历史序列起始位置相差1个时间步,从而生成高度重叠的时序片段,适用于ConvLSTM等时序建模任务。

拿到这段代码,很多人的第一反应是:它到底有没有用滑动窗口?步长是多少?别急,我们直接把`generate_dataset`函数的实现拆开看看。

核心逻辑其实藏在外层循环和两层内循环里:

def generate_dataset(data, date, n_samples, past_history, future_target):
    # ... 数据标准化与reshape ...
    date_data_n_frames = []
    for i in range(n_samples - past_history - future_target - future_target):
        # 构建历史窗口 [i, i+1, ..., i+past_history-1]
        for t in range(past_history):
            hist_data = data_4d[i + t, :, :, :]
            # ...
        # 构建未来目标窗口 [i+future_target, i+future_target+1, ..., i+2*future_target-1]
        for f in range(future_target):
            next_data = data_4d[i + (f + future_target), :, :, :]
            # ...

关键就在外层循环变量 i 的取值范围:range(n_samples - past_history - future_target - future_target),等价于 range(n_samples - past_history - 2 * future_target)。虽然这里减了两次 future_target 显得有点冗余(可能是顺手写的,不影响本质),但 i 每次递增 1 这个事实是明摆着的——每个新样本的历史段起始索引比前一个样本正好提前1帧。

所以答案已经很清楚了:滑动步长(stride)是1,既不是 past_history(24),也不是 future_target(24)。举个例子:
- 第0个样本用时间步 [0,1,…,23] 作输入;
- 第1个样本用 [1,2,…,24];
- 第2个样本用 [2,3,…,25];
- 以此类推。

这种单位步长滑动的好处是显而易见的:一方面极大地扩充了训练样本量,另一方面保留了细粒度的时序依赖关系——这正是ConvLSTM这类深度时序模型需要的标准预处理方式。

⚠️ 有两点值得注意:

  • 外层循环上限 n_samples - past_history - 2 * future_target 其实偏保守了。标准的滑动窗口通常只需要 n_samples - past_history - future_target(保证历史段加预测段不越界就行)。现在的写法虽然安全,但会丢掉一些本来合法的样本。
  • 内循环(for t in range(past_history)for f in range(future_target))都是以步长1逐帧拾取,没有任何跳帧行为,进一步佐证了 stride=1 的判断。

最终输出的 hist_data_5d 形状为 (N, past_history, 32, 32, 1),其中 N 就是滑动窗口总数,由 i 的迭代次数决定。没错,这段代码实现的就是典型的单步长滑动窗口采样,对于短时序预测任务来说,设计算得上合理。

本文转载于:https://www.php.cn/faq/2696610.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注