尽管训练是 100%,但无法提高验证准确性以及如何将从视频中提取的图像提供给深度学习模型
Unable to improve validation accuracy though training is 100% and how to feed images extracted from videos to deep learning model
我正在使用 200 亿小丑数据集构建手势识别系统。目前,我只处理 4 classes。数据集包含以 12 frames/sec 速率从视频中提取的图像。我构建了 2 个模型,3D-CNN 和 CNN-LSTM,但仅使用 keras 和 Tensorflow 获得了大约 25-30% 的准确率。
Dataset looks like X_train = (651, 1, 128, 128, 22)
X_valid=(260, 1, 128, 128, 22)
Y_train=(651, 4)
Y_valid = (260, 4)
图像大小为 128*128,有 1 个通道,我一次附加 22 张图像,样本总数为 651。
3d-CNN 架构
model = Sequential()
model.add(Convolution3D(32, (3, 3, 3), strides=(1, 1, 1), input_shape=(1, img_rows, img_cols, img_depth),
activation='relu', data_format='channels_first'))
model.add(MaxPooling3D((3, 3, 3), data_format='channels_first'))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(512, activation='sigmoid'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes, kernel_initializer='normal'))
model.add(Activation('softmax'))
CNN-LSTM 模型架构
(651, 22, 128, 128, 1)
(260, 22, 128, 128, 1)
(651, 4)
(260, 4)
model = Sequential()
model.add(TimeDistributed(Conv2D(32, (7, 7), strides=(2, 2),
activation='relu', padding='same'), input_shape=input_shape))
model.add(TimeDistributed(Conv2D(32, (3, 3),
kernel_initializer="he_normal", activation='relu')))
model.add(TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2))))
model.add(TimeDistributed(Conv2D(64, (3, 3),
padding='same', activation='relu')))
model.add(TimeDistributed(Conv2D(64, (3, 3),
padding='same', activation='relu')))
model.add(TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2))))
model.add(TimeDistributed(Conv2D(128, (3, 3),
padding='same', activation='relu')))
model.add(TimeDistributed(Conv2D(128, (3, 3),
padding='same', activation='relu')))
model.add(TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2))))
model.add(TimeDistributed(Conv2D(256, (3, 3),
padding='same', activation='relu')))
model.add(TimeDistributed(Conv2D(256, (3, 3),
padding='same', activation='relu')))
model.add(TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2))))
model.add(TimeDistributed(Conv2D(512, (3, 3),
padding='same', activation='relu')))
model.add(TimeDistributed(Conv2D(512, (3, 3),
padding='same', 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(nb_classes, activation='softmax'))
数据集与来自每个 class 的 100 个手势平衡,我 运行 100 个时期的模型。架构是否正确?我也对提供图像有疑问。因为我正在处理视频,所以我需要一个额外的维度来提取时间特征,所以首先在 1 个数组中附加 22 张图像并继续类似地附加,这是正确的方法吗?首先,我也尝试使用 12 而不是 22,但结果相同。
以下是一些建议
- 你的训练 n 是 400,我 'feel' 这样的 n 太小了,我建议将训练数据集增加到 500*4 左右。记住在写入训练数据时对数据进行洗牌,并在训练期间启用每批随机洗牌。
- 数据是否标准化(从 0 到 1,或零均值单位方差)?
- 你确定每个样本在训练数据集中有 22 张图像,如果样本没有 22 帧,你在时间通道中补零吗?
- 您是否尝试过不同的优化器、学习率?
- 对于这两种架构,瓶颈部分,我建议至少有 2 层密集层。
- 对于 3D-CNN,我建议添加更多的 cnn 层,就像您对 cnn-lstm 所做的那样。
- 对于这两种架构,除了最后一个输出层,始终使用相同的激活'relu',不需要混合和匹配(你的 CNN-LSTM 在密集层有一个 sigmoid)
- 对于这两种架构,将丢失概率降低到 0.2(如果您使用的是 keras)。
- 如果上述更改没有帮助,请为每一层添加批量归一化。
我正在使用 200 亿小丑数据集构建手势识别系统。目前,我只处理 4 classes。数据集包含以 12 frames/sec 速率从视频中提取的图像。我构建了 2 个模型,3D-CNN 和 CNN-LSTM,但仅使用 keras 和 Tensorflow 获得了大约 25-30% 的准确率。
Dataset looks like X_train = (651, 1, 128, 128, 22)
X_valid=(260, 1, 128, 128, 22)
Y_train=(651, 4)
Y_valid = (260, 4)
图像大小为 128*128,有 1 个通道,我一次附加 22 张图像,样本总数为 651。 3d-CNN 架构
model = Sequential()
model.add(Convolution3D(32, (3, 3, 3), strides=(1, 1, 1), input_shape=(1, img_rows, img_cols, img_depth),
activation='relu', data_format='channels_first'))
model.add(MaxPooling3D((3, 3, 3), data_format='channels_first'))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(512, activation='sigmoid'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes, kernel_initializer='normal'))
model.add(Activation('softmax'))
CNN-LSTM 模型架构
(651, 22, 128, 128, 1)
(260, 22, 128, 128, 1)
(651, 4)
(260, 4)
model = Sequential()
model.add(TimeDistributed(Conv2D(32, (7, 7), strides=(2, 2),
activation='relu', padding='same'), input_shape=input_shape))
model.add(TimeDistributed(Conv2D(32, (3, 3),
kernel_initializer="he_normal", activation='relu')))
model.add(TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2))))
model.add(TimeDistributed(Conv2D(64, (3, 3),
padding='same', activation='relu')))
model.add(TimeDistributed(Conv2D(64, (3, 3),
padding='same', activation='relu')))
model.add(TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2))))
model.add(TimeDistributed(Conv2D(128, (3, 3),
padding='same', activation='relu')))
model.add(TimeDistributed(Conv2D(128, (3, 3),
padding='same', activation='relu')))
model.add(TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2))))
model.add(TimeDistributed(Conv2D(256, (3, 3),
padding='same', activation='relu')))
model.add(TimeDistributed(Conv2D(256, (3, 3),
padding='same', activation='relu')))
model.add(TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2))))
model.add(TimeDistributed(Conv2D(512, (3, 3),
padding='same', activation='relu')))
model.add(TimeDistributed(Conv2D(512, (3, 3),
padding='same', 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(nb_classes, activation='softmax'))
数据集与来自每个 class 的 100 个手势平衡,我 运行 100 个时期的模型。架构是否正确?我也对提供图像有疑问。因为我正在处理视频,所以我需要一个额外的维度来提取时间特征,所以首先在 1 个数组中附加 22 张图像并继续类似地附加,这是正确的方法吗?首先,我也尝试使用 12 而不是 22,但结果相同。
以下是一些建议
- 你的训练 n 是 400,我 'feel' 这样的 n 太小了,我建议将训练数据集增加到 500*4 左右。记住在写入训练数据时对数据进行洗牌,并在训练期间启用每批随机洗牌。
- 数据是否标准化(从 0 到 1,或零均值单位方差)?
- 你确定每个样本在训练数据集中有 22 张图像,如果样本没有 22 帧,你在时间通道中补零吗?
- 您是否尝试过不同的优化器、学习率?
- 对于这两种架构,瓶颈部分,我建议至少有 2 层密集层。
- 对于 3D-CNN,我建议添加更多的 cnn 层,就像您对 cnn-lstm 所做的那样。
- 对于这两种架构,除了最后一个输出层,始终使用相同的激活'relu',不需要混合和匹配(你的 CNN-LSTM 在密集层有一个 sigmoid)
- 对于这两种架构,将丢失概率降低到 0.2(如果您使用的是 keras)。
- 如果上述更改没有帮助,请为每一层添加批量归一化。