如何构建LSTM神经网络进行分类

时间:2017-02-19 23:45:37

标签: python neural-network nlp keras lstm

我的数据在两个人之间有各种对话。每个句子都有某种类型的分类。我试图使用NLP网来对话的每个句子进行分类。我尝试了一个卷积网并得到了不错的结果(不是突破性的)。我认为,由于这是一次来回的对话,而LSTM网可能会产生更好的结果,因为之前所说的可能会对后面的内容产生很大的影响。

Type of RNN nets

如果我遵循上面的结构,我会假设我做了多对多。我的数据看起来像。

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

切换到此结构时,输入大小出错。我不确定如何重新格式化数据以满足此要求,以及如何编辑嵌入层以接收新数据格式。

任何输入都将不胜感激。或者如果您对更好的方法有任何建议,我非常乐意听到它们!

1 个答案:

答案 0 :(得分:4)

你的第一次尝试很好。改组发生在句子之间,只是在他们之间改变训练样本,这样他们就不会以相同的顺序进入。句子里面的单词没有改组。

或许我没有正确理解这个问题?

编辑

在更好地理解这个问题之后,这是我的主张。

数据准备: 您可以用<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:fillViewport="true" android:scrollbars="none" xmlns:app="http://schemas.android.com/apk/res-auto" app:layout_behavior="@string/appbar_scrolling_view_behavior" > <view.customviews.NonScrollExpandableListView app:layout_behavior="@string/appbar_scrolling_view_behavior" android:background="@color/colorPrimary" android:id="@+id/fstt_elv_time_table" android:layout_width="match_parent" android:layout_height="wrap_content" android:clipToPadding="false" /> </android.support.v4.widget.NestedScrollView> 个句子(它们可以重叠)来分割您的语料库。 然后你应该有一个类似n的形状,所以基本上是一个包含(number_blocks_of_sentences, n, number_of_words_per_sentence)个句子块的2D数组列表。 n不应该太大,因为LSTM在训练时不能处理序列中的大量元素(消失梯度)。 你的目标应该是一个形状n的数组,所以也是一个包含句子块中每个句子类的二维数组的列表。

型号:

(number_blocks_of_sentences, n, 1)

这应该是一个好的开始。

我希望这会有所帮助