CNN模型的准确性对于培训和验证集永远不会很高

时间:2018-12-28 00:23:54

标签: python machine-learning keras deep-learning conv-neural-network

我正在KTH数据集上训练CNN模型,以检测6类人类行为。

数据处理

  • 数据集包括599个视频,每个动作有25个不同的人表演的99-100个视频。我将数据分为 300 个用于训练的视频, 98 个用于验证的视频和 200 个用于测试集的视频。
  • 我将分辨率降低为 50x50 像素,因此在处理过程中不会耗尽内存。
  • 我从每个视频中间提取了 200 个帧。
  • 将像素从 0-255 标准化为 0,1
  • 最后,我将一个热点编码为类标签。

模型架构

This is my model architecture
这是NN层的代码。

model = Sequential()
model.add(Conv3D(filters=64,
         kernel_size=(3, 3, 3),
         strides=(1, 1, 1),
         padding='valid',
         activation='relu', 
         input_shape=X_train.shape[1:]))

model.add(MaxPooling3D(pool_size=2,
               strides=(2, 2, 2),
               padding='same'))

model.add(Conv3D(filters=128,
         kernel_size=(3, 3, 3),
         strides=(1, 1, 1),
         padding='valid',
         activation='relu'))

model.add(MaxPooling3D(pool_size=2,
               strides=(2, 2, 2),
               padding='same'))

model.add(Conv3D(filters=256,
         kernel_size=(3, 3, 3),
         strides=(1, 1, 1),
         padding='valid', 
         activation='relu'))

model.add(Conv3D(filters=256,
         kernel_size=(3, 3, 3),
         strides=(1, 1, 1),
         padding='valid',
         activation='relu'))

model.add(MaxPooling3D(pool_size=2,
               strides=(2, 2, 2),
               padding='same'))

model.add(Conv3D(filters=512,
         kernel_size=(3, 3, 3),
         strides=(1, 1, 1),
         padding='valid',
         activation='relu'))

model.add(Dense(4096, activation='relu'))
model.add(Dense(4096, activation='relu'))
#model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(6, activation='softmax'))

model.summary()

培训

我的问题是训练和验证的准确性都没有改变,并且从一开始它们基本上就冻结了。这些是培训步骤。 它们是the first 6 epochs,这里是last 6 epochs。 损失看起来like this。 培训损失非常高,验证损失不会改变。 培训看起来就like this

我很困惑,模型是拟合不足还是拟合过度? 我要如何解决这个问题?因为我无法对视频进行数据扩充(我认为是这样),所以辍学会有所帮助吗?

我非常感谢任何建议。

2 个答案:

答案 0 :(得分:0)

这取决于您如何使用200帧视频作为训练数据对动作进行分类。您的训练数据有太多偏见。 由于它是要分类的顺序数据,因此必须使用基于内存的体系结构或串联模型。

答案 1 :(得分:0)

您正在使用0-1的帧值,并且正在使用relu。在垂死的relu中,问题模型被冻结,根本无法学习,因为relu的最大值为b / w 0或权重*输入(如果未添加偏差)。您可以做两件事以确保模型能够正常运行,但我不确定您是否会获得良好的准确性,但是可以尝试这样做以避免出现垂死的relu问题:-

使用带有alpha的泄漏relu> = 0.2。 不要标准化框架,而只是转换为灰度以减少大量培训。 不要从中间取200帧,不要将所有视频均分成相等数量的帧块,而从每个块中取2,3个连续帧。还要尝试添加更密集的图层,因为它们有助于分类。

我处理了几乎相同的问题,我所做的是将帧合并在一起后使用Conv2d,即如果您有10个大小分别为64、64、3的帧而不是做conv3d,那么我在640、64、3数据集上做了conv2d并在16个视频课程上获得了86%的准确性。