BILSTM-Conv2D 文本分類模型

BILSTM-Conv2D 文本分類模型

在文本序列時,BILSTM不僅可以採集過去的信息,也可以採集未來的信息,當輸入一個序列,如“ABCD”時,BILSTM會將該序列正向輸入得到一個輸出向量,再將該序列反向輸入得到一個輸出向量,這兩個向量可經過拼接,加和,點乘等處理後交給下一層處理。

1D的卷積神經網絡用在文本分類模型中只會採集文本向量這個維度的信息,2D的卷積網絡不僅可以採集文本向量這個溫度,還可以採集時間戳這個維度,這個模型的思想是將BILSTM處理後得到的向量當作一個圖片,再交給Conv2D處理,池化,最後輸出分類結果。

由於LSTM輸出的向量是一個(samples,timestamp,features)維度的向量,在LSTM和Conv2D中間需要添加一個reshape層,將其reshape成一個四維的矩陣(卷積的圖片標準輸入維度),才能交給Conv2D處理。

 self.model = Sequential()
 self.model.add(Embedding(self.vocab_size+1,self.embedding_dim,input_length=self.max_len,weights=[self.embeddings_matrix], trainable=False))
 self.model.add(Dropout(0.5))
 self.model.add(Bidirectional(LSTM(self.rnn_units,return_sequences=True),merge_mode='sum'))
 self.model.add(Dropout(0.2))
 self.model.add(Reshape((-1,self.rnn_units,1)))
 self.model.add(Conv2D(64,kernel_size=(3,3),activation='relu'))
 self.model.add(MaxPool2D(pool_size=(2,2)))
 self.model.add(Dropout(0.4))
 self.model.add(Flatten())
 self.model.add(Dense(self.category_num+1,activation='softmax'))
 self.model.compile(loss='sparse_categorical_crossentropy', optimizer='adadelta',metrics=['accuracy'])
 self.model.summary()

這裏的Embedding層用於word2vec(單詞轉換爲向量),我用了事先訓練好的Glove,詞彙庫有60億,單詞維度爲100。這樣不用訓練embedding,訓練時間縮短了很多,同時這些訓練好的向量準確度也更高。

數據我用的一個BBC的新聞文件,有2000多條新聞,5個新聞種類。訓練了10個epochs後,測試集準確率達到了98.2%。相同的數據用Conv1D的模型測試,準確率只能達到97.5%左右。

最後,貼上模型的示意圖
在這裏插入圖片描述
BILSTM正向和反向輸出向量的結合方式爲相加。

詳細代碼見GitHub,模型已經訓練好,可以在json配置文件中自己定製參數重新訓練,也可以將要分類的文本寫在json文件中測試模型分類結果。

發佈了7 篇原創文章 · 獲贊 6 · 訪問量 891
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章