tensorflow實現基於LSTM的文字分類方法

2021-09-07 22:50:11 字數 3253 閱讀 3971

學習一段時間的tensor flow之後,想找個專案試試手,然後想起了之前在看theano教程中的乙個文字分類的例項,這個星期就用tensorflow實現了一下,感覺和之前使用的theano還是有很大的區別,有必要總結mark一下

這個分類的模型其實也是很簡單,主要就是乙個單層的lstm模型,當然也可以實現多層的模型,多層的模型使用tensorflow尤其簡單,下面是這個模型的圖 

簡單解釋一下這個圖,每個word經過embedding之後,進入lstm層,這裡lstm是標準的lstm,然後經過乙個時間序列得到的t個隱藏lstm神經單元的向量,這些向量經過mean pooling層之後,可以得到乙個向量h

,然後緊接著是乙個簡單的邏輯斯蒂回歸層(或者乙個softmax層)得到乙個類別分布向量。 

公式就不一一介紹了,因為這個實驗是使用了tensorflow重現了theano的實現,因此具體的公式可以參看lstm networks for sentiment analysis這個鏈結。

鄙人接觸tensor flow的時間不長,也是在慢慢摸索,但是因為有之前使用theano的經驗,對於符號化程式設計也不算陌生,因此上手tensorflow倒也容易。但是感覺tensorflow還是和theano有著很多不一樣的地方,這裡也會提及一下。 

**的模型的主要如下:

import tensorflow as tf

import numpy as np

class rnn_model(object):

def __init__(self,config,is_training=true):

self.keep_prob=config.keep_prob

模型不複雜,也就不一一解釋了,在debug的時候,還是入了幾個tensorflow的坑,因此想單獨說一下這幾個坑。

坑1:tensor flow的lstm實現 

tensorflow是已經寫好了幾個lstm的實現類,可以很方便的使用,而且也可以選擇多種型別的lstm,包括basic、bi-directional等等。 

這個**用的是basiclstm:

#build lstm network

在這段**裡面,tf.nn.rnn_cell.basiclstmcell的初始化只需要制定lstm神經元的隱含神經元的個數即可,然後需要初始化lstm網路的引數:self._initial_state = cell.zero_state(self.batch_size,dtype=tf.float32),這句**乍看一下很迷糊,開始並不知道是什麼意義,在實驗以及查閱原始碼之後,返現這句話返回的是兩個維度是batch_size*hidden_neural_size的零向量元組,其實就是lstm初始化的c0

、h0向量,當然這裡指的是對於單層的lstm,對於多層的,返回的是多個元組。

坑2:這段**中的zero_state和迴圈代數num_step都需要制定 

這裡比較蛋疼,這就意味著tensorflow中實現變長的情況是要padding的,而且需要全部一樣的長度,但是因為資料集的原因,不可能每個batch的size都是一樣的,這裡就需要每次執行前,動態制定batch_size的大小,**中體現這個的是assign_new_batch_size函式,但是對於num_step引數卻不能動態指定(可能是因為筆者沒找到,但是指定tf.variable()方法確實不行),出於無奈只能將資料集全部padding成指定大小的size,當然既然使用了padding那就必須使用mask矩陣進行計算。

坑3:cost返回non 

cost返回non一般是因為在使用交叉熵時候,logits這一邊出現了0值,因此stack overflow上推薦的一般是:sparse_softmax_cross_entropy_with_logits(self.logits+1e-10,self.target)這樣寫法

實驗背景: 

tensor flow: tensor flow 1.1 

platform:mac os 

資料集:subject dataset,資料集都經過了預處理,拿到的是其在詞表中的索引 

得益於tensorboard各個引數訓練過程都可以視覺化,下面是實驗訓練結果:

訓練集訓練結果: 

驗證集訓練結果 

損失函式訓練過程 

各個引數訓練結果: 

最終在測試集上,準確度約為85%,還不錯。

tensor flow 和 theano 是最近比較流行的深度學習框架,兩者非常相似但是兩者又不一樣,下面就我個人體驗比較下兩者的異同。

難易程度

就使用難度而言,tensorflow的便易性要遠勝於theano,畢竟theano是一堆學者研究出來的,而tensorflow是google研究出來的,比較面向工業化。tensor flow直接整合了學術界的很多方法,比如像rnn、lstm等都已經被tensorflow整合了,還有比如引數更新方法如梯度下降、adadelta等也已經被tensorflow寫好了,但是對於theano這個就得自己寫,當然難易程度不一樣了。

靈活性就靈活性而言,theano是要勝過tensor flow的,正是因為上一點theano的門檻稍高,卻也使得theano有著更大的彈性,可以實現自己任意定義的網路結果,這裡不是說tensorflow不行,tensorflow也能寫,但是使用tensorflow久了之後,寫一些自定義的結構能力就會生疏許多,比如修改lstm內的一些結構。而theano則沒有這個約束。

容錯性 

我個人覺得theano的容錯性是比tensor flow要高的,theano定義變數,只需要制定型別,比如imatrix、ivertor之類的而不用制定任何的維度,只要你輸入的資料和你的網路結構圖能夠對的上的話,就沒問題,而tensorflow擇需要預先指定一些引數(如上面**的num_step引數),相比而言,theano的容錯能力多得多,當然這樣也有壞處,那就是可能對導致**除錯起來比較費勁兒。

基於tensorflow實現線性回歸

1.1 回歸分析 回歸分析是一種 性的建模技術,它研究的是因變數 目標 和自變數 器 之間的關係。這種技術通常用於 分析,時間序列模型以及發現變數之間的因果關係。通常使用曲線 線來擬合資料點,目標是使曲線到資料點的距離差異最小 1.2 線性回歸 在統計學中,線性回歸 linear regressio...

L2正則化 tensorflow實現

l2正則化是一種減少過擬合的方法,在損失函式中加入刻畫模型複雜程度的指標。假設損失函式是j 則優化的是j r w r w n i 0 w2i 在tensorflow中的具體實現過程如下 coding utf 8 import tensorflow as tf defget weight shape,...

L2正則化的TensorFlow實現

tensorflow實現l2正則化 tensorflow的最優化方法tf.train.gradientdescentoptimizer包辦了梯度下降 反向傳播,所以基於tensorflow實現l2正則化,並不能按照上節的演算法直接干預權重的更新,而要使用tensorflow方式 tf.add to ...