tensorflow - 用于图像序列分类的 CNN 和 LSTM
问题描述
我正在尝试建立一个学习延迟决策任务的模型,该任务可以描述如下:
从一个空网格(4x4 单元格)开始,一个随机形状(正方形、圆形或三角形),大小和颜色随机出现在单元格中。然后,对于随机数量的延迟帧(预定义的最大延迟帧数),网格再次变空。之后,网格上的不同单元格中出现了两个形状,其中一个与前一个形状相对应,但颜色和大小不同。该模型的目标是选择包含先前形状的单元格。单元格从 0 到 15 编号,首先计算行数。
为了实现这个任务,我使用了 pygame。这使我能够生成一组训练数据,其中包含 1000 个图像序列(64x64 像素 x 3 个通道)。
我使用 Keras 构建了模型,但我遇到了一些问题,因为我的模型似乎没有学习。它由 3 个卷积池层、一个 LSTM 层和一个用于输出的密集层组成。此外,为了简单起见,我开始使用恒定数量的延迟帧,以使我的序列具有恒定大小。
这是我的模型代码:
def build_model(shape=(DELAYFRAMES+3, SIZE[0], SIZE[1], 3), nbout=16):
# Create the model
model = keras.Sequential()
# Create the conv-pool layers
model.add(TimeDistributed(Conv2D(36, (7, 7), input_shape=shape[1:], padding='same', activation='relu'),input_shape=shape))
model.add(TimeDistributed(MaxPool2D()))
model.add(TimeDistributed(Conv2D(72, (6, 6), padding='same', activation='relu')))
model.add(TimeDistributed(MaxPool2D()))
model.add(TimeDistributed(Conv2D(108, (5, 5), padding='same', activation='relu')))
model.add(TimeDistributed(MaxPool2D()))
model.add(TimeDistributed(Flatten()))
# Add LSTM layer
model.add(LSTM(64))
# Add output layer
model.add(Dense(16,activation='softmax'))
print(model.summary())
return model
这里,DELAYFRAMES
=1, SIZE[0]
= SIZE[1]
=64 并且nbout
是类(单元格)的数量。我猜这是我对 LSTM 层的理解不足。我不确定 LSTM 的参数(单位数)是什么意思。这可能是我的模型不学习的原因吗?我的训练集的准确率值在 0.025 和 0.10 之间波动,这告诉我这个决定是完全随机的 (1/16 = 0.0625) 跨时期。
解决方案
推荐阅读
- arrays - 将多列堆叠为一列而不忽略空白单元格
- swift - 未触发 Combine 中的 CombineLatest
- ruby-on-rails - 仅遍历持久对象
- css - SVG 转换滞后于 firefox
- git - 为什么我已经添加了 git remote add 后需要在本地分支上设置上游?
- anaconda - Conda 环境损坏
- mule - Mule 4 /DW 2.0 如何根据“标题”插入此 JSON?
- java - 在 pod 意外关闭时运行退出逻辑的最佳方法
- json - 在pyspark中解析json格式的列
- python - 使用 csv.DictReader() 后如何按源顺序排列数据?