she*_*kit 45 machine-learning neural-network lstm keras recurrent-neural-network
有人可以解释一下吗?我知道双向LSTM有前向和后向通过,但这比单向LSTM有什么优势?
他们每个人更适合什么?
blu*_*ers 68
LSTM的核心是使用隐藏状态保存已经通过它的输入信息.
单向LSTM仅保留过去的信息,因为它看到的唯一输入来自过去.
使用双向将以两种方式运行您的输入,一种从过去到未来,一种从未来到过去,这种方法与单向的不同之处在于,在向后运行的LSTM中,您保留来自未来的信息并使用两个隐藏状态组合您能够在任何时间点保存过去和未来的信息.
他们适合的是一个非常复杂的问题,但BiLSTM显示非常好的结果,因为他们可以更好地理解上下文,我将尝试通过一个例子来解释.
让我们说我们试图预测一个句子中的下一个单词,从高层次来看单向LSTM会看到的是什么
男孩们去了....
并且将尝试仅通过此上下文预测下一个单词,使用双向LSTM,您将能够在未来的路上看到更多信息,例如
转发LSTM:
男孩们去了......
落后LSTM:
......然后他们离开了游泳池
您可以看到,使用未来的信息,网络可以更容易地理解下一个词是什么.
Par*_*Sen 10
相比LSTM
,BLSTM
或BiLSTM
具有两个网络,一个访问past
在信息forward
方向和另一接入future
的reverse
方向。维基
根据Bidirectional
此处的官方文档添加了一个新类:https : //www.tensorflow.org/api_docs/python/tf/keras/layers/Bidirectional
model = Sequential()
model.add(Bidirectional(LSTM(10, return_sequences=True), input_shape=(5,
10)))
Run Code Online (Sandbox Code Playgroud)
和激活函数可以这样添加:
model = Sequential()
model.add(Bidirectional(LSTM(num_channels,
implementation = 2, recurrent_activation = 'sigmoid'),
input_shape=(input_length, input_dim)))
Run Code Online (Sandbox Code Playgroud)
使用 IMDB 数据的完整示例将是这样的。4 epoch 后的结果。
Downloading data from https://s3.amazonaws.com/text-datasets/imdb.npz
17465344/17464789 [==============================] - 4s 0us/step
Train...
Train on 25000 samples, validate on 25000 samples
Epoch 1/4
25000/25000 [==============================] - 78s 3ms/step - loss: 0.4219 - acc: 0.8033 - val_loss: 0.2992 - val_acc: 0.8732
Epoch 2/4
25000/25000 [==============================] - 82s 3ms/step - loss: 0.2315 - acc: 0.9106 - val_loss: 0.3183 - val_acc: 0.8664
Epoch 3/4
25000/25000 [==============================] - 91s 4ms/step - loss: 0.1802 - acc: 0.9338 - val_loss: 0.3645 - val_acc: 0.8568
Epoch 4/4
25000/25000 [==============================] - 92s 4ms/step - loss: 0.1398 - acc: 0.9509 - val_loss: 0.3562 - val_acc: 0.8606
Run Code Online (Sandbox Code Playgroud)
BiLSTM或BLSTM
import numpy as np
from keras.preprocessing import sequence
from keras.models import Sequential
from keras.layers import Dense, Dropout, Embedding, LSTM, Bidirectional
from keras.datasets import imdb
n_unique_words = 10000 # cut texts after this number of words
maxlen = 200
batch_size = 128
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=n_unique_words)
x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
x_test = sequence.pad_sequences(x_test, maxlen=maxlen)
y_train = np.array(y_train)
y_test = np.array(y_test)
model = Sequential()
model.add(Embedding(n_unique_words, 128, input_length=maxlen))
model.add(Bidirectional(LSTM(64)))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print('Train...')
model.fit(x_train, y_train,
batch_size=batch_size,
epochs=4,
validation_data=[x_test, y_test])
Run Code Online (Sandbox Code Playgroud)
在Bluesummer的答案中,这是您从头开始实现双向LSTM而不调用BiLSTM
模块的方法。这可能会更好地对比单向和双向LSTM之间的差异。如您所见,我们将两个LSTM合并以创建双向LSTM。
您可以使用合并前向和后向LSTM的输出{'sum', 'mul', 'concat', 'ave'}
。
left = Sequential()
left.add(LSTM(output_dim=hidden_units, init='uniform', inner_init='uniform',
forget_bias_init='one', return_sequences=True, activation='tanh',
inner_activation='sigmoid', input_shape=(99, 13)))
right = Sequential()
right.add(LSTM(output_dim=hidden_units, init='uniform', inner_init='uniform',
forget_bias_init='one', return_sequences=True, activation='tanh',
inner_activation='sigmoid', input_shape=(99, 13), go_backwards=True))
model = Sequential()
model.add(Merge([left, right], mode='sum'))
model.add(TimeDistributedDense(nb_classes))
model.add(Activation('softmax'))
sgd = SGD(lr=0.1, decay=1e-5, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd)
print("Train...")
model.fit([X_train, X_train], Y_train, batch_size=1, nb_epoch=nb_epoches, validation_data=([X_test, X_test], Y_test), verbose=1, show_accuracy=True)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
29879 次 |
最近记录: |