发布于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 的迭代次数决定。没错,这段代码实现的就是典型的单步长滑动窗口采样,对于短时序预测任务来说,设计算得上合理。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8