RNN-文本分類系列(二)

第二站textRNN
在上節講解CNN的結構中,我們知道,CNN有諸多好處,但有一個限制就是,他們的輸入必須是固定size的向量。即不能爲變長的。
並且CNN不能捕獲過長的上下文結構,比如上節中我們提到的用卷積核的尺寸決定了詞上下文的範圍。

循環神經網絡

引用知乎,侵刪
如上圖所示,這是循環神經網絡一個神經元,經過一次Xt後輸入後會產生兩個輸出,其中一個是ht,另一個輸出(往往叫做state)又送回到神經元中,是爲了與下一次的輸出Xt+1結合。這樣就在一定程度上保留了以往的信息。

lstm與gru

LSTM是RNN的變體,雖然理論上RNN有記憶功能,但實際訓練的時候發現,它不具有記住很早以前的輸入的能力。爲了解決長期記憶的問題,lstm就誕生了。
在這裏插入圖片描述
如下圖所示,最上一層線的信號,代表細胞狀態,包括x捨棄部分原來信息,+增加新的部分信息,經過處理後作爲ht輸出。
因爲有最上一層的細胞狀態故能做到長期記憶。
Gru是lstm的簡化版本。

代碼部分

我們使用單層LSTM和雙層的LSTM
使用雙層是因爲雙層可以做到雙向推導,即能保有從前到後的信息,又能保有從後到前的信息。

    def design_model(self,hiden_size=32,with_fc=False):
        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=L.LSTM(hiden_size,dropout=0.4)(x)
        if with_fc:
            x=L.Dense(hiden_size,activation='relu')(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
    
    
    def design_model_with_bilstm(self,hiden_size=32,with_fc=False):
        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=L.Bidirectional(L.LSTM(hiden_size,dropout=0.4))(x)
        if with_fc:
            x=L.Dense(hiden_size,activation='relu')(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

完整代碼見此處

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