如何构建用于分类的 LSTM 神经网络
How to structure an LSTM neural network for classification
我有两个人之间的各种对话的数据。每个句子都有某种类型的分类。我正在尝试使用 NLP 网络对对话中的每个句子进行分类。我尝试了一个卷积网络并获得了不错的结果(不是突破性的)。我想既然这样来来回回的对话,LSTM net 可能会产生更好的结果,因为前面所说的可能会对后面的内容产生很大的影响。
如果我按照上面的结构,我会假设我在做多对多。我的数据看起来像。
X_train = [[sentence 1],
[sentence 2],
[sentence 3]]
Y_train = [[0],
[1],
[0]]
已使用 word2vec 处理数据。然后我按如下方式设计我的网络..
model = Sequential()
model.add(Embedding(len(vocabulary),embedding_dim,
input_length=X_train.shape[1]))
model.add(LSTM(88))
model.add(Dense(1,activation='sigmoid'))
model.compile(optimizer='rmsprop',loss='binary_crossentropy',
metrics['accuracy'])
model.fit(X_train,Y_train,verbose=2,nb_epoch=3,batch_size=15)
我假设此设置将一次输入一批句子。但是,如果在 model.fit 中,shuffle 不等于 false 它接收打乱的批次,那么为什么 LSTM 网络在这种情况下甚至有用?根据对该主题的研究,要实现多对多结构,也需要更改 LSTM 层
model.add(LSTM(88,return_sequence=True))
输出层需要...
model.add(TimeDistributed(Dense(1,activation='sigmoid')))
当切换到这个结构时,我在输入大小上遇到错误。我不确定如何重新格式化数据以满足此要求,以及如何编辑嵌入层以接收新的数据格式。
如有任何意见,我们将不胜感激。或者,如果您对更好的方法有任何建议,我非常乐意听到!
你的第一次尝试很好。洗牌发生在句子之间,只是洗牌它们之间的训练样本,这样它们就不会总是以相同的顺序出现。句子中的单词不会打乱。
或者我没有正确理解问题?
编辑 :
在对问题有了更深入的理解后,提出我的建议。
数据准备: 您将语料库分成 n
个句子块(它们可以重叠)。
然后你应该有一个像 (number_blocks_of_sentences, n, number_of_words_per_sentence)
这样的形状,所以基本上是一个包含 n
句子块的二维数组列表。 n
不应该太大,因为 LSTM 在训练时无法处理序列中的大量元素(梯度消失)。
您的目标应该是一个形状为 (number_blocks_of_sentences, n, 1)
的数组,因此也是一个包含句子块中每个句子的 class 的二维数组列表。
型号:
n_sentences = X_train.shape[1] # number of sentences in a sample (n)
n_words = X_train.shape[2] # number of words in a sentence
model = Sequential()
# Reshape the input because Embedding only accepts shape (batch_size, input_length) so we just transform list of sentences in huge list of words
model.add(Reshape((n_sentences * n_words,),input_shape = (n_sentences, n_words)))
# Embedding layer - output shape will be (batch_size, n_sentences * n_words, embedding_dim) so each sample in the batch is a big 2D array of words embedded
model.add(Embedding(len(vocabaulary), embedding_dim, input_length = n_sentences * n_words ))
# Recreate the sentence shaped array
model.add(Reshape((n_sentences, n_words, embedding_dim)))
# Encode each sentence - output shape is (batch_size, n_sentences, 88)
model.add(TimeDistributed(LSTM(88)))
# Go over lines and output hidden layer which contains info about previous sentences - output shape is (batch_size, n_sentences, hidden_dim)
model.add(LSTM(hidden_dim, return_sequence=True))
# Predict output binary class - output shape is (batch_size, n_sentences, 1)
model.add(TimeDistributed(Dense(1,activation='sigmoid')))
...
这应该是一个好的开始。
希望对您有所帮助
我有两个人之间的各种对话的数据。每个句子都有某种类型的分类。我正在尝试使用 NLP 网络对对话中的每个句子进行分类。我尝试了一个卷积网络并获得了不错的结果(不是突破性的)。我想既然这样来来回回的对话,LSTM net 可能会产生更好的结果,因为前面所说的可能会对后面的内容产生很大的影响。
如果我按照上面的结构,我会假设我在做多对多。我的数据看起来像。
X_train = [[sentence 1],
[sentence 2],
[sentence 3]]
Y_train = [[0],
[1],
[0]]
已使用 word2vec 处理数据。然后我按如下方式设计我的网络..
model = Sequential()
model.add(Embedding(len(vocabulary),embedding_dim,
input_length=X_train.shape[1]))
model.add(LSTM(88))
model.add(Dense(1,activation='sigmoid'))
model.compile(optimizer='rmsprop',loss='binary_crossentropy',
metrics['accuracy'])
model.fit(X_train,Y_train,verbose=2,nb_epoch=3,batch_size=15)
我假设此设置将一次输入一批句子。但是,如果在 model.fit 中,shuffle 不等于 false 它接收打乱的批次,那么为什么 LSTM 网络在这种情况下甚至有用?根据对该主题的研究,要实现多对多结构,也需要更改 LSTM 层
model.add(LSTM(88,return_sequence=True))
输出层需要...
model.add(TimeDistributed(Dense(1,activation='sigmoid')))
当切换到这个结构时,我在输入大小上遇到错误。我不确定如何重新格式化数据以满足此要求,以及如何编辑嵌入层以接收新的数据格式。
如有任何意见,我们将不胜感激。或者,如果您对更好的方法有任何建议,我非常乐意听到!
你的第一次尝试很好。洗牌发生在句子之间,只是洗牌它们之间的训练样本,这样它们就不会总是以相同的顺序出现。句子中的单词不会打乱。
或者我没有正确理解问题?
编辑 :
在对问题有了更深入的理解后,提出我的建议。
数据准备: 您将语料库分成 n
个句子块(它们可以重叠)。
然后你应该有一个像 (number_blocks_of_sentences, n, number_of_words_per_sentence)
这样的形状,所以基本上是一个包含 n
句子块的二维数组列表。 n
不应该太大,因为 LSTM 在训练时无法处理序列中的大量元素(梯度消失)。
您的目标应该是一个形状为 (number_blocks_of_sentences, n, 1)
的数组,因此也是一个包含句子块中每个句子的 class 的二维数组列表。
型号:
n_sentences = X_train.shape[1] # number of sentences in a sample (n)
n_words = X_train.shape[2] # number of words in a sentence
model = Sequential()
# Reshape the input because Embedding only accepts shape (batch_size, input_length) so we just transform list of sentences in huge list of words
model.add(Reshape((n_sentences * n_words,),input_shape = (n_sentences, n_words)))
# Embedding layer - output shape will be (batch_size, n_sentences * n_words, embedding_dim) so each sample in the batch is a big 2D array of words embedded
model.add(Embedding(len(vocabaulary), embedding_dim, input_length = n_sentences * n_words ))
# Recreate the sentence shaped array
model.add(Reshape((n_sentences, n_words, embedding_dim)))
# Encode each sentence - output shape is (batch_size, n_sentences, 88)
model.add(TimeDistributed(LSTM(88)))
# Go over lines and output hidden layer which contains info about previous sentences - output shape is (batch_size, n_sentences, hidden_dim)
model.add(LSTM(hidden_dim, return_sequence=True))
# Predict output binary class - output shape is (batch_size, n_sentences, 1)
model.add(TimeDistributed(Dense(1,activation='sigmoid')))
...
这应该是一个好的开始。
希望对您有所帮助