2018-01-07cs20si:tf學習筆記 -轉載自廖星宇

小白學CNN以及Keras的速成(3)

https://sherlockliao.github.io/2017/04/29/keras3/

2017 深度學習框架發展大盤點--迎來 PyTorch,告別 Theano

http://sh.qihoo.com/pc/2s1corcpl1y?sign=360_e39369d1

轉載自廖星宇


cs20si: tensorflow for research 學習筆記1-4

https://zhuanlan.zhihu.com/p/28924642

https://sherlockliao.github.io/2017/08/30/cs20si3/

代碼:

https://github.com/SherlockLiao/tensorflow-beginner/blob/master/lab/logistic_regression_mnist.py


cs20si: tensorflow for research 學習筆記3

Sherlock

4 個月前

TensorFlow中的Linear Regression

線性回歸是機器學習中非常簡單的問題,我們用tensorflow實現一個小例子。

問題: 希望能夠找到一個城市中縱火案和盜竊案之間的關系,縱火案的數量是X,盜竊案的數量是Y,我們建設存在如下線性關系,Y = wX + b。

TensorFlow實現

首先定義輸入X和目標Y的占位符(placeholder)

X=tf.placeholder(tf.float32,shape=[],name='input')Y=tf.placeholder(tf.float32,shape=[],name='label')

里面shape=[ ]表示標量(scalar)

然后定義需要更新和學習的參數w和b

w=tf.get_variable('weight',shape=[],initializer=tf.truncated_normal_initializer())b=tf.get_variable('bias',shape=[],initializer=tf.zeros_initializer())

接著定義好模型的輸出以及誤差函數,這里使用均方誤差(Y - Y_predicted)^2

Y_predicted=w*X+bloss=tf.square(Y-Y_predicted,name='loss')

然后定義好優化函數,這里使用最簡單的梯度下降,這里的學習率不僅可以是常量,還可以是一個tensor

optimizer=tf.train.GradientDescentOptimizer(learning_rate=1e-3).minimize(loss)

tensorflow是如何判斷哪些參數該更新,哪些參數不更新呢?tf.Variabel(trainable=False)就表示不對該參數進行更新,默認下tf.Variable(trainable=True)。

然后在session中做運算

init=tf.global_variables_initializer()withtf.Session()assess:writer=tf.summary.FileWriter('./linear_log',graph=sess.graph)sess.run(init)foriinrange(100):total_loss=0forx,yindata:_,l=sess.run([optimizer,h_loss],feed_dict={X:x,Y:y})total_loss+=lprint("Epoch {0}: {1}".format(i,total_loss/n_samples))

可視化

我們可以打開tensorboard查看我們的結構圖如下

最后我們將數據點和預測的直線畫出來

如何改善模型

1. 我們可以增加維度,原始模型是Y = Xw + b,我們可以提升一維,使其變成Y = X^2 w1 + X w2 + b

2. 可以換一種loss的計算方式,比如huber loss,當誤差比較小的時候使用均方誤差,誤差比較大的時候使用絕對值誤差

在實現huber loss的時候,因為tf是以圖的形式來定義,所以不能使用邏輯語句,比如if等,我們可以使用TensorFlow中的條件判斷語句,比如tf.where、tf.case等等,huber loss的實現方法如下

defhuber_loss(labels,predictions,delta=1.0):residual=tf.abs(predictions-labels)condition=tf.less(residual,delta)small_res=0.5*residual**2large_res=delta*residual-0.5*delta**2returntf.where(condition,small_res,large_res)

關于Optimizer

TensorFlow會自動求導,然后更新參數,使用一行代碼tf.train.GradientDescentOptimizer(learning_rate=1e-3).minimize(loss),下面我們將其細分開來,講一講每一步。

自動梯度

首先優化函數的定義就是前面一部分opt = tf.train.GradientDescentOptimizer(learning_rate),定義好優化函數之后,可以通過grads_and_vars = opt.compute_gradients(loss, )來計算loss對于一個變量列表里面每一個變量的梯度,得到的grads_and_vars是一個list of tuples,list中的每個tuple都是由(gradient, variable)構成的,我們可以通過get_grads_and_vars = [(gv[0], gv[1]) for gv in grads_and_vars]將其分別取出來,然后通過opt.apply_gradients(get_grads_and_vars)來更新里面的參數,下面我們舉一個小例子。

importtensorflowastfx=tf.Variable(5,dtype=tf.float32)y=tf.Variable(3,dtype=tf.float32)z=x**2+x*y+3sess=tf.Session()# initialize variablesess.run(tf.global_variables_initializer())# define optimizeroptimizer=tf.train.GradientDescentOptimizer(0.1)# compute gradient z w.r.t x and ygrads_and_vars=optimizer.compute_gradients(z,[x,y])# fetch the variableget_grads_and_vars=[(gv[0],gv[1])forgvingrads_and_vars]# dz/dx = 2*x + y= 13# dz/dy = x = 5print('grads and variables')print('x: grad {}, value {}'.format(sess.run(get_grads_and_vars[0][0]),sess.run(get_grads_and_vars[0][1])))print('y: grad {}, value {}'.format(sess.run(get_grads_and_vars[1][0]),sess.run(get_grads_and_vars[1][1])))print('Before optimization')print('x: {}, y: {}'.format(sess.run(x),sess.run(y)))# optimize parametersopt=optimizer.apply_gradients(get_grads_and_vars)# x = x - 0.1 * dz/dx = 5 - 0.1 * 13 = 3.7# y = y - 0.1 * dz/dy = 3 - 0.1 * 5 = 2.5print('After optimization using learning rate 0.1')sess.run(opt)print('x: {:.3f}, y: {:.3f}'.format(sess.run(x),sess.run(y)))sess.close()

上面程序的注釋已經解釋了所有的內容,就不細講了,最后可以得到下面的結果。

在實際中,我們當然不用手動更新參數,optimizer類可以幫我們自動更新,另外還有一個函數也能夠計算梯度。

tf.gradients(ys,xs,grad_ys=None,name='gradients',colocate_gradients_with_ops=False,gate_gradients=False,aggregation_method=None)

這個函數會返回list,list的長度就是xs的長度,list中每個元素都是?

實際運用:?這個方法對于只訓練部分網絡非常有用,我們能夠使用上面的函數只對網絡中一部分參數求梯度,然后對他們進行梯度的更新。

優化函數類型

隨機梯度下降(GradientDescentOptimizer)僅僅只是tensorflow中一個小的更新方法,下面是tensorflow目前支持的更新方法的總結

tf.train.GradientDescentOptimizertf.train.AdadeltaOptimizertf.train.AdagradOptimizertf.train.AdagradDAOptimizertf.train.MomentumOptimizertf.train.AdamOptimizertf.train.FtrlOptimizertf.train.ProximalGradientDescentOptimizertf.train.ProximalAdagradOptimizertf.train.RMSPropOptimizer

這個博客對上面的方法都做了介紹,感興趣的同學可以去看看,另外cs231n和coursera的神經網絡課程也對各種優化算法做了介紹。

TensorFlow 中的Logistic Regression

我們使用簡單的logistic regression來解決分類問題,使用MNIST手寫字體,我們的模型公式如下

TensorFlow實現

TF Learn中內置了一個腳本可以讀取MNIST數據集

fromtensorflow.examples.tutorials.mnistimportinput_datamnist=input_data.read_data_sets('./data/mnist',one_hot=True)

接著定義占位符(placeholder)和權重參數

x=tf.placeholder(tf.float32,shape=[None,784],name='image')y=tf.placeholder(tf.int32,shape=[None,10],name='label')w=tf.get_variable('weight',shape=[784,10],initializer=tf.truncated_normal_initializer())b=tf.get_variable('bias',shape=[10],initializer=tf.zeros_initializer())

輸入數據的shape=[None, 784]表示第一維接受任何長度的輸入,第二維等于784是因為28x28=784。權重w使用均值為0,方差為1的正態分布,偏置b初始化為0。

然后定義預測結果、loss和優化函數

logits=tf.matmul(x,w)+bentropy=tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=logits)loss=tf.reduce_mean(entropy,axis=0)optimizer=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)

使用tf.matmul做矩陣乘法,然后使用分類問題的loss函數交叉熵,最后將一個batch中的loss求均值,對其使用隨機梯度下降法。

因為數據集中有測試集,所以可以在測試集上驗證其準確率

preds=tf.nn.softmax(logits)correct_preds=tf.equal(tf.argmax(preds,1),tf.argmax(y,1))accuracy=tf.reduce_sum(tf.cast(correct_preds,tf.float32),axis=0)

首先對輸出結果進行softmax得到概率分布,然后使用tf.argmax得到預測的label,使用tf.equal得到預測的label和實際的label相同的個數,這是一個長為batch的0-1向量,然后使用tf.reduce_sum得到正確的總數。

最后在session中運算,這個過程就不再贅述。

### 結果與可視化

最后可以得到訓練集的loss的驗證集準確率如下

可以發現經過10 epochs,驗證集能夠實現74%的準確率。同時,我們還能夠得到tensorboard可視化如下。

這看著是有點混亂的,所以下一次課會講一下如何結構化我們的模型。

本文的全部代碼都在github

歡迎訪問我的博客

歡迎查看我的知乎專欄深度煉丹

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,923評論 6 535
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,740評論 3 420
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,856評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,175評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,931評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,321評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,383評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,533評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,082評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,891評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,618評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,319評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,732評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,987評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,794評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,076評論 2 375

推薦閱讀更多精彩內容