Skip to main content

Kerasでの1対多、多対1、および多対多のLSTMの例

さまざまな深層学習タスクのためのLSTMのユースケース
Created on January 30|Last edited on January 31
このレポートは、Ayush Thakurによる「One-to-Many, Many-to-One and Many-to-Many LSTM Examples in Keras」の翻訳です。
このレポートでは、長短期記憶(LSTM)とKerasを使用してそれらを構築する方法について説明します。 リカレントニューラルネットワーク(RNN)を実行するには、主に4つのモードがあります。


それぞれのミニマルなコードスニペットがKerasでどのように見えるかを見てみましょう

LSTMは、さまざまなモードを使用する多数の深層学習タスクに使用できます。 これらの各モードを、Kerasでのユースケースとコードスニペットとともに説明します。

1対多

1対多のシーケンス問題とはは、入力データに1つのタイムステップがあり、出力に複数の値または複数のタイムステップのベクトルが含まれるシーケンス問題です。 したがって、単一の入力と一連の出力があります。 典型的な例は、画像の説明が生成される画像のキャプションです。 詳細については、Rajesh Shreedhar Bhat氏とSouradip Chakraborty氏によるこの驚くべき「Generate Meaningful Captions for Images with Attention Models」レポートを確認してください。

これを例で見てみましょう

下の画像に示すおもちゃのデータセットを作成しました。 入力データは一連の数字であり、出力データは入力番号の次の2つの数字のシーケンスです。



バニラLSTMでトレーニングしましょう。 プロットに示されているように、トレインと検証データの損失メトリックを確認できます。
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(1, 1)))
model.add(Dense(2))

model.compile(optimizer='adam', loss='mse')

wandb.init(entity='ayush-thakur', project='dl-question-bank')

model.fit(X, Y, epochs=1000, validation_split=0.2, batch_size=3, callbacks=[WandbCallback()])
入力が10であるテストデータを使用して予測する場合、モデルがシーケンスを生成することを期待します[11、12]。 モデルは、期待値に近いシーケンス[[11.00657 12.138181]]を予測しました。





多対1

多対1のシーケンスの問題では、入力としてデータのシーケンスがあり、単一の出力を予測する必要があります。 感情分析またはテキスト分類は、そのようなユースケースの1つです。

これを例で見てみましょう

画像に示すように、おもちゃのデータセットを作成しました。 入力には3つのタイムステップを持つ15のサンプルがあり、出力は各ステップの値の合計です。


バニラLSTMでトレーニングしましょう。 プロットに示されているように、トレインと検証データの損失メトリックを確認することができます。
tf.keras.backend.clear_session()
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(3, 1)))
model.add(Dense(1))

model.compile(optimizer='adam', loss='mse')

wandb.init(entity='ayush-thakur', project='dl-question-bank')

history = model.fit(X, Y, epochs=1000, validation_split=0.2, verbose=1, callbacks=[WandbCallback()])
テストデータで予測する場合、入力は3つのタイムステップのシーケンスです。[50,51,52]. 期待される出力は、値の合計である153である必要があります。モデルは値を予測しましたが:[[152.9253]], これは期待値に非常に近いものになっています。





多対多

多対多のシーケンス学習は、入力シーケンスが特定の言語であり、出力シーケンスが他の言語である機械翻訳に使用できます。 これは、ビデオ分類にも使用できます。入力シーケンスは、さまざまなタイムステップでのビデオの各フレームの特徴表現です。
エンコーダー-デコーダーネットワークは、一般的に多対多のシーケンスタスクに使用されます。 ここで、エンコーダー-デコーダーは、2つのLSTMレイヤーを備えたニューラルアーキテクチャーの単なる名前です。

これを例で見てみましょう

このおもちゃの実験では、下の画像に示すデータセットを作成しました。 入力にはそれぞれ3つのタイムステップを持つ20のサンプルがあり、出力には次の3つの連続する5の倍数がありま���。


バニラエンコーダ-デコーダアーキテクチャでトレーニングしましょう。 プロットに示されているように、トレインと検証データの損失メトリックを確認できます。
model = Sequential()

# encoder layer
model.add(LSTM(100, activation='relu', input_shape=(3, 1)))

# repeat vector
model.add(RepeatVector(3))

# decoder layer
model.add(LSTM(100, activation='relu', return_sequences=True))

model.add(TimeDistributed(Dense(1)))
model.compile(optimizer='adam', loss='mse')

print(model.summary())

wandb.init(entity='ayush-thakur', project='dl-question-bank')

history = model.fit(X, Y, epochs=1000, validation_split=0.2, verbose=1, batch_size=3, callbacks=[WandbCallback()])
テストデータで予測する場合、入力は3つのタイムステップのシーケンスです:[300, 305, 310]. 期待される出力は、次の3つの連続する5の倍数のシーケンスである必要があります: [315, 320, 325]。モデルは値を予測しました:[[[315.29865], [321.0397 ], [327.0003 ]]]これは期待値に近いです。





さらに読む

これらは、これらの概念の私自身の理解に関連すると私が見つけたリソースの一部です。
(Usman Malik氏によるKerasブログ投稿のLSTMでのシーケンス問題の解決は、コードスニペットを作成するために使用されました。)

Iterate on AI agents and models faster. Try Weights & Biases today.