我目前正在尝试构建一个使用图像序列的模型,并使用TF后端对Keras中序列中的每个项目进行分类(不保留序列之间的状态);但是,我遇到了第一层输入形状的问题 .

模型看起来像这样:

model.add(TimeDistributed(Conv2D(64, (3, 3), activation='relu'), input_shape=(10, 1, 224, 224, 3)))
model.add(TimeDistributed(MaxPooling2D((2, 2), strides=(1, 1))))

model.add(TimeDistributed(Conv2D(128, (4,4), activation='relu')))
model.add(TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2))))

model.add(TimeDistributed(Conv2D(256, (4,4), activation='relu')))
model.add(TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2))))

model.add(TimeDistributed(Flatten()))
model.add(Dropout(0.5))

model.add(LSTM(256, return_sequences=False, dropout=0.5))

model.add(Dense(num_classes, activation='sigmoid'))

我认为我的问题来自于对阵列形状缺乏了解,而且我很可能在这里犯了一个业余错误 . 每个单独的序列被加载到一个numpy形状的数组(10,1,224,224,3),其中第一个轴是序列中的项目数(它们被填充为相同的长度),第二个是批处理大小,其他只是一个RGB图像 . 根据我的理解,从阅读文档(和我的错误)的可用信息,时间分布式包装器内的conv2D采用5D数组,基本上被格式化为(批量大小,行,列,通道)的正常conv2D输入加上添加时间维度(序列中的每个项目) . 这是否接近准确?

转到我正面临的问题...如果我尝试输入形状的图像序列(10,1,224,224,3),我得到错误“ValueError:输入通道的数量与相应的维度不匹配过滤器,224!= 3“ . 任何人都可以对此有所了解吗?我很确定我没有正确地调整输入数组和input_shape .

我有一个人可能能够回答的另一个问题是:一旦这个问题得到解决并且我可以使用序列作为输入,我该如何为模型提供不仅仅是如上所示的单个图像序列,而是使用数组序列?我的数据集由数千个这些序列组成 . 我之前使用Caffe的所有经验都是使用Caffe,当然不是任何使用循环模型的东西,所以不仅我不熟悉实际的网络,我不熟悉Keras整体(虽然我开始学习,虽然慢慢地大声笑) . 根据我的经验和观察,Caffe在您和数据输入之间提供了一个沉重的抽象层,所以我以前从未处理过这个问题 .

我希望这个问题和我的问题清晰简洁,所提供的任何信息都非常感谢!