前提・実現したいこと
機械学習初心者で機械学習に関する勉強を行っています。
現在CNNとLSTMを組み合わせた25単語の読唇モデルをkerasで構築しているのですが、インターネット上で色々調べてみても構築方法がよく分かりませんでした。
Conv3D単体では正常に動作して6割程度の認識率を得られるのですが、LSTMと組み合わせた途端に認識率がガクンと落ちてしまいます。
下記のコードで実装方法は問題ないのでしょうか、それともConv3DとLSTMは本来組み合わせるようなものではないのでしょうか。
どなたか詳しい方がおりましたら回答お願いします。
該当のソースコード
X_train = x_train.reshape((x_train.shape[0], IMAGE_SIZE, IMAGE_SIZE, DEPTH_NUM, CHANNEL_NUM)) X_test = x_test.reshape((x_test.shape[0], IMAGE_SIZE, IMAGE_SIZE, DEPTH_NUM, CHANNEL_NUM)) Y_train = np_utils.to_categorical(y_train, WORD_NUM) Y_test = np_utils.to_categorical(y_test, WORD_NUM) X_train = X_train.astype("float32") X_test = X_test.astype("float32") model = Sequential() model.add(Conv3D(32, kernel_size=(3, 3, 3), input_shape=(X_train.shape[1:]), padding="same")) model.add(Activation("relu")) model.add(Conv3D(32, kernel_size=(3, 3, 3), padding="same")) model.add(Activation("softmax")) model.add(MaxPooling3D(pool_size=(3, 3, 3), padding="same")) model.add(Dropout(0.25)) model.add(Conv3D(64, kernel_size=(3, 3, 3), padding="same")) model.add(Activation("relu")) model.add(Conv3D(64, kernel_size=(3, 3, 3), padding="same")) model.add(Activation("softmax")) model.add(MaxPooling3D(pool_size=(3, 3, 3), padding="same")) model.add(Dropout(0.25))
ここから
model.add(Reshape((-1,64)))
model.add(LSTM(256))
ここまでを元のコードに追加しました。
model.add(Flatten())
model.add(Dense(512, activation="sigmoid"))
model.add(Dropout(0.5))
model.add(Dense(WORD_NUM, activation="softmax"))
opt = optimizers.Adam(lr=LEARNING_RATE) model.compile(loss=categorical_crossentropy, optimizer=opt, metrics=["accuracy"]) model.summary() history = model.fit(X_train, Y_train, batch_size=BATCH_SIZE, epochs=EPOCH, validation_data=(X_test, Y_test))
補足情報(FW/ツールのバージョンなど)
Microsoft Visual Studio2017
tensorflow 2.4.1
keras2.4.3
Python 3.6.13
あなたの回答
tips
プレビュー