web-dev-qa-db-ja.com

Kerasで1対1、1対多、多対1、および多対多のLSTMニューラルネットワークをどのように定義できますか?

私は this の記事(リカレントニューラルネットワークの不合理な有効性)を読んでいて、1対1、1対多、多対1、および多対多を表現する方法を理解したいと思っています。 -Kerasの多くのLSTMニューラルネットワーク。 RNNについて多くのことを読み、LSTM NNがどのように機能するか、特に勾配消失、LSTMセル、それらの出力と状態、シーケンス出力などを理解しました。しかし、これらすべての概念をKerasで表現するのに苦労しています。

まず、LSTMレイヤーを使用して次のおもちゃNNを作成しました

from keras.models import Model
from keras.layers import Input, LSTM
import numpy as np

t1 = Input(shape=(2, 3))
t2 = LSTM(1)(t1)
model = Model(inputs=t1, outputs=t2)

inp = np.array([[[1,2,3],[4,5,6]]])
model.predict(inp)

出力:

array([[ 0.0264638]], dtype=float32)

私の例では、入力形状は2 x 3です。これは、入力が2つのベクトルのシーケンスであり、各ベクトルに3つの特徴があることを意味します。したがって、入力は形状(n_examples, 2, 3)の3Dテンソルである必要があります。 。 'sequences'に関しては、入力は長さ2のシーケンスであり、シーケンス内の各要素は3つの特徴で表されます(間違っている場合は訂正してください)。 predictを呼び出すと、単一のスカラーを持つ2次元テンソルが返されます。そう、

Q1:それは1対1または別のタイプのLSTMネットワークですか?

「1つ/多くの入力と1つ/多くの出力」と言うとき

Q2:「1つ/多くの入力/出力」とはどういう意味ですか? 「1つ/多くの」スカラー、ベクトル、シーケンス...、1つ/多くの何?

Q3:ネットワークのタイプ(1-1、1-M、M-1、M-M)ごとにKerasで簡単な実例を挙げてもらえますか?

PS:非常に密接で相互に関連しているため、1つのスレッドで複数の質問をします。

4
fade2black

区別1対11対多多対1 多対多は、RNN/LSTMまたはシーケンシャル(時間)データを処理するネットワークの場合にのみ存在します、CNNは空間データを処理しますが、この区別はありません。したがって、多くのには常に複数のタイムステップ/ aシーケンスが含まれます

異なる種は、入力と出力の形状とその分類を説明します。入力の場合oneは、単一の入力数量がクローズド数量として分類されることを意味し、manyは、数量のシーケンス(つまり、画像、単語のシーケンス)はクローズド数量として分類されます。出力の場合oneは、出力がスカラーであることを意味します(バイナリ分類、つまりは鳥またはは鳥ではない)_0_または_1_、多くは、出力がワンホットであることを意味します各クラスに1つの次元を持つエンコードされたベクトル(マルチクラス分類、つまりはスズメはロビン、...)、つまり3つのクラス_001, 010, 100_:

次の例では、画像と画像のシーケンスが分類される数量として使用されます。あるいは、単語または...と単語のシーケンス(文)または...を使用することもできます。

1対1:単一の画像(または単語、。。。)は単一のクラスに分類されます(二項分類)。つまり、これは鳥かどうか

1対多:単一の画像(または単語、.。)は複数のクラスに分類されます

多対1:画像のシーケンス(または単語、...)は単一のクラスに分類されます(シーケンスの二項分類)

多対多:一連の画像(または単語、...)は複数のクラスに分類されます

cfhttps://www.quora.com/How-can-I-choose-between-one-to-one-one-to-many-many-to- 1対1および多対多の長短期記憶-LSTM


1対1(_activation=sigmoid_(デフォルト)_loss=mean_squared_error_)

_from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
# prepare sequence
length = 5
seq = array([i/float(length) for i in range(length)])
X = seq.reshape(len(seq), 1, 1)
y = seq.reshape(len(seq), 1)
# define LSTM configuration
n_neurons = length
n_batch = length
n_Epoch = 1000
# create LSTM
model = Sequential()
model.add(LSTM(n_neurons, input_shape=(1, 1)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
print(model.summary())
# train LSTM
model.fit(X, y, epochs=n_Epoch, batch_size=n_batch, verbose=2)
# evaluate
result = model.predict(X, batch_size=n_batch, verbose=0)
for value in result:
    print('%.1f' % value)
_

ソース:https://machinelearningmastery.com/timedistributed-layer-for-long-short-term-memory-networks-in-python/


one-to-manyは、RepeatVector()を使用して、単一の量をマルチクラス分類に必要なシーケンスに変換します

_def test_one_to_many(self):
        params = dict(
            input_dims=[1, 10], activation='tanh',
            return_sequences=False, output_dim=3
        ),
        number_of_times = 4
        model = Sequential()
        model.add(RepeatVector(number_of_times, input_shape=(10,)))

        model.add(LSTM(output_dim=params[0]['output_dim'],
                       activation=params[0]['activation'],
                       inner_activation='sigmoid',
                       return_sequences=True,
                       ))
        relative_error, keras_preds, coreml_preds = simple_model_eval(params, model)
        # print relative_error, '\n', keras_preds, '\n', coreml_preds, '\n'
        for i in range(len(relative_error)):
            self.assertLessEqual(relative_error[i], 0.01) 
_

ソース:https://www.programcreek.com/python/example/89689/keras.layers.RepeatVector

代替1対多

_model.add(RepeatVector(number_of_times, input_shape=input_shape))
model.add(LSTM(output_size, return_sequences=True))
_

ソース:Kerasの多対1および多対多のLSTMの例


多対1二項分類(_loss=binary_crossentropy_、_activation=sigmoid_ 、完全に接続された出力レイヤーの次元は1(Dense(1))、スカラーを出力します、_0_または_1_)

_model = Sequential()
model.add(Embedding(5000, 32, input_length=500))
model.add(LSTM(100, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])        
print(model.summary())
model.fit(X_train, y_train, epochs=3, batch_size=64)
# Final evaluation of the model
scores = model.evaluate(X_test, y_test, verbose=0)
_

多対多マルチクラス分類(_loss=sparse_categorial_crossentropy_、_activation=softmax_ 、ターゲットのワンホットエンコーディングが必要、グラウンドトゥルースデータ、完全に接続された出力層の次元は7です(_Dense71)_)は、7つのクラスがワンホットエンコードされているという点で7次元ベクトルを出力します)

_from keras.models import Sequential
from keras.layers import *

model = Sequential()
model.add(Embedding(5000, 32, input_length=500))
model.add(LSTM(100, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(7, activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

model.summary()
_

cfKeras LSTMマルチクラス分類

TimeDistributed layer cf https://machinelearningmastery.com/timedistributed-layer-for)を使用した代替多対多 -long-short-term-memory-networks-in-python / 説明

_from keras.models import Sequential
from keras.layers import Dense
from keras.layers import TimeDistributed
from keras.layers import LSTM
# prepare sequence
length = 5
seq = array([i/float(length) for i in range(length)])
X = seq.reshape(1, length, 1)
y = seq.reshape(1, length, 1)
# define LSTM configuration
n_neurons = length
n_batch = 1
n_Epoch = 1000
# create LSTM
model = Sequential()
model.add(LSTM(n_neurons, input_shape=(length, 1), return_sequences=True))
model.add(TimeDistributed(Dense(1)))
model.compile(loss='mean_squared_error', optimizer='adam')
print(model.summary())
# train LSTM
model.fit(X, y, epochs=n_Epoch, batch_size=n_batch, verbose=2)
# evaluate
result = model.predict(X, batch_size=n_batch, verbose=0)
for value in result[0,:,0]:
    print('%.1f' % value)
_

ソース:https://machinelearningmastery.com/timedistributed-layer-for-long-short-term-memory-networks-in-python/

6
ralf htp