我正在KTH数据集上训练CNN模型,以检测6类人类行为。
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。
我很困惑,模型是拟合不足还是拟合过度? 我要如何解决这个问题?因为我无法对视频进行数据扩充(我认为是这样),所以辍学会有所帮助吗?
我非常感谢任何建议。
答案 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%的准确性。