學習一段時間的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 ...