tensorflow实现基于LSTM的文本分类方法
http://blog.csdn.net/u010223750/article/details/53334313?locationNum=7&fps=1
引言
學(xué)習(xí)一段時(shí)間的tensor flow之后,想找個(gè)項(xiàng)目試試手,然后想起了之前在看Theano教程中的一個(gè)文本分類的實(shí)例,這個(gè)星期就用tensorflow實(shí)現(xiàn)了一下,感覺(jué)和之前使用的theano還是有很大的區(qū)別,有必要總結(jié)mark一下
模型說(shuō)明
這個(gè)分類的模型其實(shí)也是很簡(jiǎn)單,主要就是一個(gè)單層的LSTM模型,當(dāng)然也可以實(shí)現(xiàn)多層的模型,多層的模型使用Tensorflow尤其簡(jiǎn)單,下面是這個(gè)模型的圖?
?
簡(jiǎn)單解釋一下這個(gè)圖,每個(gè)word經(jīng)過(guò)embedding之后,進(jìn)入LSTM層,這里L(fēng)STM是標(biāo)準(zhǔn)的LSTM,然后經(jīng)過(guò)一個(gè)時(shí)間序列得到的t個(gè)隱藏LSTM神經(jīng)單元的向量,這些向量經(jīng)過(guò)mean pooling層之后,可以得到一個(gè)向量h,然后緊接著是一個(gè)簡(jiǎn)單的邏輯斯蒂回歸層(或者一個(gè)softmax層)得到一個(gè)類別分布向量。?
公式就不一一介紹了,因?yàn)檫@個(gè)實(shí)驗(yàn)是使用了Tensorflow重現(xiàn)了Theano的實(shí)現(xiàn),因此具體的公式可以參看LSTM Networks for Sentiment Analysis這個(gè)鏈接。
tensorflow實(shí)現(xiàn)
鄙人接觸tensor flow的時(shí)間不長(zhǎng),也是在慢慢摸索,但是因?yàn)橛兄笆褂肨heano的經(jīng)驗(yàn),對(duì)于符號(hào)化編程也不算陌生,因此上手Tensorflow倒也容易。但是感覺(jué)tensorflow還是和theano有著很多不一樣的地方,這里也會(huì)提及一下。?
代碼的模型的主要如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
模型不復(fù)雜,也就不一一解釋了,在debug的時(shí)候,還是入了幾個(gè)tensorflow的坑,因此想單獨(dú)說(shuō)一下這幾個(gè)坑。
坑1:tensor flow的LSTM實(shí)現(xiàn)?
tensorflow是已經(jīng)寫(xiě)好了幾個(gè)LSTM的實(shí)現(xiàn)類,可以很方便的使用,而且也可以選擇多種類型的LSTM,包括Basic、Bi-Directional等等。?
這個(gè)代碼用的是BasicLSTM:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
在這段代碼里面,tf.nn.rnn_cell.BasicLSTMCell的初始化只需要制定LSTM神經(jīng)元的隱含神經(jīng)元的個(gè)數(shù)即可,然后需要初始化LSTM網(wǎng)絡(luò)的參數(shù):self._initial_state = cell.zero_state(self.batch_size,dtype=tf.float32),這句代碼乍看一下很迷糊,開(kāi)始并不知道是什么意義,在實(shí)驗(yàn)以及查閱源碼之后,返現(xiàn)這句話返回的是兩個(gè)維度是batch_size*hidden_neural_size的零向量元組,其實(shí)就是LSTM初始化的c0、h0向量,當(dāng)然這里指的是對(duì)于單層的LSTM,對(duì)于多層的,返回的是多個(gè)元組。
坑2:這段代碼中的zero_state和循環(huán)代數(shù)num_step都需要制定?
這里比較蛋疼,這就意味著tensorflow中實(shí)現(xiàn)變長(zhǎng)的情況是要padding的,而且需要全部一樣的長(zhǎng)度,但是因?yàn)閿?shù)據(jù)集的原因,不可能每個(gè)batch的size都是一樣的,這里就需要每次運(yùn)行前,動(dòng)態(tài)制定batch_size的大小,代碼中體現(xiàn)這個(gè)的是assign_new_batch_size函數(shù),但是對(duì)于num_step參數(shù)卻不能動(dòng)態(tài)指定(可能是因?yàn)楣P者沒(méi)找到,但是指定tf.Variable()方法確實(shí)不行),出于無(wú)奈只能將數(shù)據(jù)集全部padding成指定大小的size,當(dāng)然既然使用了padding那就必須使用mask矩陣進(jìn)行計(jì)算。
坑3:cost返回non?
cost返回Non一般是因?yàn)樵谑褂媒徊骒貢r(shí)候,logits這一邊出現(xiàn)了0值,因此stack overflow上推薦的一般是:sparse_softmax_cross_entropy_with_logits(self.logits+1e-10,self.target)這樣寫(xiě)法
訓(xùn)練and結(jié)果
實(shí)驗(yàn)背景:?
tensor flow: tensor flow 1.1?
platform:mac OS?
數(shù)據(jù)集:subject dataset,數(shù)據(jù)集都經(jīng)過(guò)了預(yù)處理,拿到的是其在詞表中的索引?
得益于tensorboard各個(gè)參數(shù)訓(xùn)練過(guò)程都可以可視化,下面是實(shí)驗(yàn)訓(xùn)練結(jié)果:
訓(xùn)練集訓(xùn)練結(jié)果:?
?
驗(yàn)證集訓(xùn)練結(jié)果?
?
損失函數(shù)訓(xùn)練過(guò)程?
?
各個(gè)參數(shù)訓(xùn)練結(jié)果:?
最終在測(cè)試集上,準(zhǔn)確度約為85%,還不錯(cuò)。
比較tensorflow和thenao
tensor flow 和 theano 是最近比較流行的深度學(xué)習(xí)框架,兩者非常相似但是兩者又不一樣,下面就我個(gè)人體驗(yàn)比較下兩者的異同。
難易程度
就使用難度而言,tensorflow的便易性要遠(yuǎn)勝于theano,畢竟theano是一堆學(xué)者研究出來(lái)的,而tensorflow是Google研究出來(lái)的,比較面向工業(yè)化。tensor flow直接集成了學(xué)術(shù)界的很多方法,比如像RNN、LSTM等都已經(jīng)被tensorflow集成了,還有比如參數(shù)更新方法如梯度下降、Adadelta等也已經(jīng)被tensorflow寫(xiě)好了,但是對(duì)于theano這個(gè)就得自己寫(xiě),當(dāng)然難易程度不一樣了。
靈活性
就靈活性而言,theano是要?jiǎng)龠^(guò)tensor flow的,正是因?yàn)樯弦稽c(diǎn)theano的門檻稍高,卻也使得theano有著更大的彈性,可以實(shí)現(xiàn)自己任意定義的網(wǎng)絡(luò)結(jié)果,這里不是說(shuō)tensorflow不行,tensorflow也能寫(xiě),但是使用tensorflow久了之后,寫(xiě)一些自定義的結(jié)構(gòu)能力就會(huì)生疏許多,比如修改LSTM內(nèi)的一些結(jié)構(gòu)。而Theano則沒(méi)有這個(gè)約束。
我個(gè)人覺(jué)得theano的容錯(cuò)性是比tensor flow要高的,theano定義變量,只需要制定類型,比如imatrix、ivertor之類的而不用制定任何的維度,只要你輸入的數(shù)據(jù)和你的網(wǎng)絡(luò)結(jié)構(gòu)圖能夠?qū)Φ纳系脑?#xff0c;就沒(méi)問(wèn)題,而tensorflow擇需要預(yù)先指定一些參數(shù)(如上面代碼的num_step參數(shù)),相比而言,theano的容錯(cuò)能力多得多,當(dāng)然這樣也有壞處,那就是可能對(duì)導(dǎo)致代碼調(diào)試起來(lái)比較費(fèi)勁兒。
代碼?
本文的代碼可以在這里獲得,轉(zhuǎn)載請(qǐng)注明出處。?
25/11/2016,于北京
轉(zhuǎn)載于:https://www.cnblogs.com/DjangoBlog/p/7279988.html
總結(jié)
以上是生活随笔為你收集整理的tensorflow实现基于LSTM的文本分类方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: webx学习(三)——Webx Turb
- 下一篇: 微软发布新品被指剽窃!交涉无果,两年开源