私は 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つのスレッドで複数の質問をします。
区別1対1、1対多、多対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)
_
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))
_
多対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()
_
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)
_