lstm 128个神经元怎么理解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lstm 128个神经元怎么理解相关的知识,希望对你有一定的参考价值。

lstm一个cell表示一个神经元,128个神经元表示每一个输入Xt同时传给128个lstm cell。也就是说每一次输入都有128个cell与之相连 参考技术A 我感觉就是有128个LSTM,因为LSTM就是一个比较大的神经元。它替换掉了Simple Neural Network中的sigmoid激活函数。sigmoid激活函数就是Simple Neural Network的神经元。 参考技术B 好难理解。

双向 LSTM 和 LSTM 有啥区别?

【中文标题】双向 LSTM 和 LSTM 有啥区别?【英文标题】:What's the difference between a bidirectional LSTM and an LSTM?双向 LSTM 和 LSTM 有什么区别? 【发布时间】:2017-08-19 12:52:06 【问题描述】:

有人可以解释一下吗?我知道双向 LSTM 有前向和后向传递,但与单向 LSTM 相比,这有什么优势?

他们每个人更适合什么?

【问题讨论】:

【参考方案1】:

LSTM 在其核心中使用隐藏状态保留来自已经通过它的输入的信息。

单向 LSTM 仅保留过去的信息,因为它看到的唯一输入来自过去。

使用双向将以两种方式运行您的输入,一种从过去到未来,一种从未来到过去,这种方法与单向的不同之处在于,在向后运行的 LSTM 中,您可以保留来自未来的信息strong> 并结合使用两种隐藏状态,您可以在任何时间点保存过去和未来的信息。

它们适合的是一个非常复杂的问题,但是 BiLSTMs 显示出非常好的结果,因为它们可以更好地理解上下文,我将尝试通过一个例子来解释。

假设我们尝试预测句子中的下一个单词,在高层次上,单向 LSTM 将看到的是

男孩们去了....

并且将尝试仅通过此上下文预测下一个单词,例如,使用双向 LSTM,您将能够看到更远的信息

前向 LSTM:

男孩们去了……

后向 LSTM:

...然后他们从游泳池里出来了

您可以看到,使用来自未来的信息,网络可能更容易理解下一个单词是什么。

【讨论】:

一个疑问,当一个句子通过双向 lstm 运行时,如果我们试图对句子进行编码,我们应该使用前向或后向 lstm 单元的输出? 我不认为有一个答案,但我相信同时使用这两者将是一个好方法 - 也许这篇文章可以帮助web.stanford.edu/class/cs224n/reports/2760320.pdf 但是双向 lstm 的使用会受到限制,对吧?因为当您尝试预测一个单词时,您不会知道下一个单词,也许您可​​以指出一些现实世界的例子?非常感谢! 有很多用途,就像你说的,翻译、情感分析和其他与 NLP 无关的应用程序。双向 LSTM(甚至超过 2 路 LSTM)也可以应用于图像或光谱仪输入 @Kailegh bi-LSTM 通常用于序列到序列的应用程序,您在预测时知道完整的输入,但您不知道它对应的是什么。如前所述,示例包括翻译(您拥有完整的短语)、语音识别(您拥有完整的话语)、OCR(您拥有完整的图像)【参考方案2】:

除了 Bluesummer 的回答之外,这里是您如何在不调用 BiLSTM 模块的情况下从头开始实现双向 LSTM。这可能更好地对比单向和双向 LSTM 之间的差异。如您所见,我们将两个 LSTM 合并以创建一个双向 LSTM。

您可以使用'sum', 'mul', 'concat', 'ave' 合并前向和后向 LSTM 的输出。

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)

【讨论】:

如果使用Bidirectional(LSTM(64))而不是leftright会有什么不同吗?如果不是,那么 Bidirectional 的内部是否是这样实现的?【参考方案3】:

LSTM相比,BLSTMBiLSTM有两个网络,一个在forward方向访问past信息,另一个在reverse方向访问future。 wiki

根据官方文档在这里添加了一个新类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)))

激活函数可以这样添加:

model = Sequential()
model.add(Bidirectional(LSTM(num_channels, 
        implementation = 2, recurrent_activation = 'sigmoid'),
        input_shape=(input_length, input_dim)))

使用 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

BiLSTMBLSTM

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])

【讨论】:

【参考方案4】:

双向 LSTM 的另一个用例可能是文本中的单词分类。他们可以看到单词的过去和未来的上下文,并且更适合对单词进行分类。

【讨论】:

【参考方案5】:

它还有助于解决时间序列预测问题,例如预测家庭的用电量。但是,我们也可以在这方面使用 LSTM,但双向 LSTM 也会做得更好。

【讨论】:

以上是关于lstm 128个神经元怎么理解的主要内容,如果未能解决你的问题,请参考以下文章

从动图中理解 RNN,LSTM 和 GRU

【译】理解LSTM(通俗易懂版)

如何简单的理解LSTM——其实没有那么复杂

直观理解LSTM(长短时记忆网络)

RNN与LSTM原理

lstm和gru结构的再理解