You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras视频下一帧预测模型输入形状错误排查求助

解决ConvLSTM2D与Conv2DTranspose维度不匹配问题

问题根源

ConvLSTM2D层如果设置return_sequences=True(或默认保留序列输出),会输出5维张量:(batch_size, timesteps, height, width, filters),而Conv2DTranspose层仅接受4维张量:(batch_size, height, width, channels),这就是报错的直接原因。

针对性解决方案

根据你单帧输入→单帧输出的需求,提供两种最简解决方式:

1. 修改ConvLSTM2D的return_sequences参数

直接将ConvLSTM2D的return_sequences设为False,丢弃时间维度,输出4维张量后直接对接Conv2DTranspose:

from keras.models import Sequential
from keras.layers import ConvLSTM2D, Conv2DTranspose

model = Sequential()
# 输入形状:(样本数, 时间步长=1, 224, 224, 通道数)
model.add(ConvLSTM2D(
    filters=64,
    kernel_size=(3,3),
    padding='same',
    return_sequences=False,  # 关键:关闭序列返回,输出4维张量
    input_shape=(1, 224, 224, 3)
))
# 此时输入Conv2DTranspose的是4维张量,符合要求
model.add(Conv2DTranspose(
    filters=3,
    kernel_size=(3,3),
    padding='same',
    activation='sigmoid'
))

2. 手动移除时间维度(适用于多时间步输入场景)

如果需要用前N帧预测下一帧(N>1),ConvLSTM2D需保留时间维度处理序列,可通过Lambda层提取最后一个时间步的特征,转为4维张量:

from keras.models import Sequential
from keras.layers import ConvLSTM2D, Conv2DTranspose, Lambda

model = Sequential()
# 输入形状:(样本数, 时间步长=N, 224, 224, 3)
model.add(ConvLSTM2D(
    filters=64,
    kernel_size=(3,3),
    padding='same',
    return_sequences=True,  # 保留序列用于多步处理
    input_shape=(5, 224, 224, 3)
))
# 提取最后一个时间步的特征,转为4维张量
model.add(Lambda(lambda x: x[:, -1, :, :, :]))
model.add(Conv2DTranspose(
    filters=3,
    kernel_size=(3,3),
    padding='same',
    activation='sigmoid'
))

数据集预处理注意事项

你的97帧图像需生成96个样本对:

  • 输入X的形状应为:(96, timesteps, 224, 224, 3)(timesteps设为1或你需要的步数)
  • 输出y的形状应为:(96, 224, 224, 3)(对应每组输入的下一帧)
  • 需将图像像素值归一化到0-1区间,避免训练不稳定。

内容的提问来源于stack exchange,提问作者Hector PAYAZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 13:13:12