トレーニングは100%であり、動画から抽出した画像をディープラーニングモデルにフィードする方法にもかかわらず、検証の精度を向上させることはできません

チンメイシン

私は200億のジェスターデータセットを使用してジェスチャ認識システムを構築しています。現在、私は4つのクラスのみに取り組んでいます。データセットは、12フレーム/秒の速度でビデオから抽出された画像で構成されています。3D-CNNとCNN-LSTMの2つのモデルを作成しましたが、ケラと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チャンネルで、サンプル総数として651枚ずつ22枚ずつ追加しています。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'))

データセットは各クラスからの100ジェスチャとバランスが取れており、モデルを100エポック実行しました。アーキテクチャは正しいですか?画像のフィードについても疑問があります。私はビデオに取り組んでいるので、時間的特徴を抽出するために追加の次元が必要なので、最初に1つの配列に22の画像を追加し、同様に追加し続けますが、それは正しい方法ですか?最初に22ではなく12で試しましたが、同じ結果になりました。

パンギュテン

以下はいくつかの提案です

  • トレーニングnが400の場合、このnが小さすぎるように感じます。トレーニングデータセットを500 * 4のように増やすことをお勧めします。トレーニングデータを書き込むときはデータをシャッフルし、トレーニング中はバッチごとにランダムなシャッフルを有効にすることを忘れないでください。
  • データは正規化されていますか(0から1、またはゼロの平均単位分散)?
  • 各サンプルのトレーニングデータセットに22個の画像があり、22個のフレームがない場合は、サンプルのタイムチャネルにゼロパッドを使用しますか?
  • さまざまなオプティマイザー、学習率を試しましたか?
  • ボトルネックセグメントの両方のアーキテクチャでは、少なくとも2層の密な層をお勧めします。
  • 3D-CNNの場合、cnn-lstmで行ったように、さらにいくつかのcnnレイヤーを追加することをお勧めします。
  • 両方のアーキテクチャで、最後の出力レイヤーの横で、一貫して同じアクティベーション「relu」を使用し、混合して一致させる必要はありません(CNN-LSTMの高密度レイヤーにはシグモイドがあります)
  • 両方のアーキテクチャで、ドロップアウトの確率をおそらく0.2に減らします(kerasを使用している場合)。
  • 上記の変更が役に立たない場合は、各レイヤーのバッチ正規化を追加します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ