使用 CNN 和 RNN 进行图像序列训练

jva*_*rio 5 python machine-learning deep-learning keras tensorflow

我正在迈出学习深度学习的第一步。我正在尝试从视频的图像序列(帧)中进行活动识别。结果,我面临着训练程序的问题。

首先,我需要确定我的图像文件夹的架构:

Making Food -> p1 -> rgb_frame1.png,rgb_frame2.png ... rgb_frame200.png
Making Food -> p2 -> rgb_frame1.png,rgb_frame2.png ... rgb_frame280.png
                      ...
                      ...
                      ...
Taking  Medicine -> p1 -> rgb_frame1.png,rgb_frame2.png...rgbframe500.png

                      etc..
      
Run Code Online (Sandbox Code Playgroud)

所以问题是每个文件夹可以有不同数量的帧,所以我对模型的输入形状和我应该使用的时间步长感到困惑。我正在创建一个模型(如下所示),其中包含时间分布的 CNN(预训练的 VGG16)和 LSTM,该模型将所有类别的所有帧与相应的标签作为输入(在上面的示例中,制作食物将是 p1_rgb_frame1 的相应标签)等)和的最终形状x_train(9000,200,200,3)其中9000coresponds从所有类的所有帧,200是高度及宽度和3图像的信道。我正在重塑这些数据(9000,1,200,200,3)以用作模型的输入。我想知道并担心我没有通过正确的时间步长,结果是错误的训练,我有 val_acc ~ 98% 但是当使用不同的数据集进行测试时要低得多。你能提出另一种更有效的方法吗?

  x = base_model.output
  x = Flatten()(x)
  features = Dense(64, activation='relu')(x)
  conv_model = Model(inputs=base_model.input, outputs=features)    
  for layer in base_model.layers:
      layer.trainable = False
       
  model = Sequential()
  model.add(TimeDistributed(conv_model, input_shape=(None,200,200,3)))
  model.add(LSTM(32, return_sequences=True))
  model.add(LSTM(16))
Run Code Online (Sandbox Code Playgroud)

mCo*_*ing 2

据我所知,你的模型的结构显然并不糟糕。就不同数量的帧问题而言,解决方案就是不这样做。预处理数据以从每个操作中获取相同数量的帧。

这里更深层次的问题很可能只是简单的过度拟合。您没有指定,但基于您正在谈论在一台计算机上托管培训数据的事实,我想您没有太多培训数据,并且您的网络不是在学习活动,而只是在学习识别您的训练数据。考虑一下 VGG16 拥有大约 120 万个不同的训练示例,并在高端 GPU 上训练了数周,只是为了区分 1000 类静态图像。可以说,学习时间方面和活动应该需要类似数量的训练数据。你有一个好主意,从 VGG 作为基础开始,然后添加到它的基础上,这样你的网络就不必重新学习静态图像识别功能,但你的网络需要学习的从静态图像到动态视频的概念飞跃仍然是一个很大的问题一!