textCNN 文本分類系列-tf2.0 keras實現(一)

寫在前面:今天開始總結一下文本分類任務中常見的神經網絡模型。
第一站textCNN

文本分類任務

文本分類任務是自然語言處理(NLP)中很重要的子任務,比如文本情感分類,對於一段話,比如評價,判斷是積極的還是消極的。
在此我們用卷積神經網絡來解決這個問題。

卷積神經網絡

卷積神經網絡最初是在14年左右應用到圖像處理領域中的,由於卷積神經網絡具有平移不變性和參數共享特點,有強大的特徵提取能力(表徵學習),在很多圖像識別任務中取得了非常顯著的效果,成爲當時的STOA(最好的方案)。
在圖像識別中,我們往往應用的是二維卷積核,我們想利用卷積神經網絡提取到圖像的空間特徵,而由於圖像有寬高兩個維度,於是我們就是用二維卷積核。又如視頻等輸入,我們往往會用三維卷積來處理。
文本類的信息只有位置上的先後關係,我們就採用一維卷積核來處理
此部分簡單介紹卷積的工作原理,會有專門一章來介紹卷積層。

二維卷積運算

卷積運算,引用於動手學習深度學習
上圖所示,假設輸入是一張圖片方格內的值爲其像素,*代表卷積運算,圖片藍色部分和內容和卷積核相對應的位置相乘,最後求和成爲了第一個輸出(藍色部分)。
然後依次向右向下移動輸入的選中部分,依次與卷積核進行運算得出全部的輸出。

一維卷積運算

一維卷積運算如下圖所示。

一維卷積可以將相鄰的位置關聯起來,這種方式就可以提取上下文特徵。不同大小的卷積核可以提取不同範圍的特徵。

卷積層

在卷積層後緩解位置敏感的問題,我們會用到池化層進行下采樣,池化層的計算方式和卷積類似。常見的池化層有最大池化層和平均池化層。此外,我們往往會在其中加上BatchNorm層以緩解卷積神經網絡訓練參數過多帶來的過擬合問題。

TextCNN 模型實現

卷積塊

我們是用tf2.0 中keras API實現的,我們將卷積+batchnorm+池化做成一個可以複用的塊。

    def conv1D_with_bn_gp(self,filters,kernel_size):
        blk = K.models.Sequential()
        blk.add(L.Conv1D(filters=filters,kernel_size=kernel_size))
        blk.add(L.BatchNormalization())
        blk.add(L.Activation("relu"))
        blk.add(L.GlobalMaxPool1D())
        return blk

模型結構

我們使用了三個不同大小的卷積核,與經過詞嵌入(將單詞映射爲向量)的詞向量進行卷積運算,把最後的結果拼接起來,送入全連接網絡進行分類。

    def design_model_with_multi_kernel_size(self,hiden_size=64):
        input_layer=L.Input(shape=(None,),name='feature_input')
        x=L.Embedding(input_dim=self.emb.wordCount,output_dim=self.emb.wordDim,input_length=self.emb.sequenceLength)(input_layer)
        
        
        x_5=self.conv1D_with_bn_gp(filters=100,kernel_size=5)(x)
        x_4=self.conv1D_with_bn_gp(filters=100,kernel_size=4)(x)
        x_3=self.conv1D_with_bn_gp(filters=100,kernel_size=3)(x)
        
        x=L.concatenate([x_3,x_4,x_5])
        x=L.Dense(hiden_size,activation='relu',name="feature_output")(x)
        x=L.Dropout(0.5)(x)
        output_layer=L.Dense(2,activation='softmax')(x)
        
        model=K.models.Model(inputs=[input_layer],outputs=[output_layer],name=self.name)
        self.model=model
        model.summary()
        return model

完整代碼見此處

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章