機器學習自學筆記09: Keras2.0
文章推薦指數: 80 %
Keras 介紹. Tensorflow 是目前最流行的machine learning庫之一。
但是他沒有這麼好用tensorflow 和另一個功能相近的toolkit theano,這兩個都 ...
機器學習
機器學習自學筆記09:Keras2.0
bywenwu
2020-07-17
bywenwu
2020-07-17
0comment
內容目錄
機器學習自學筆記09:Keras2.0Keras介紹Keras實作Step1:defineasetoffunction — neural networkStep2:goodnessoffunction — cross entropyStep3:pickthebest functionMini-batchBatchsizeandTraining Speedbatchsize太小會導致不穩定,速度上也沒有優勢Batchsize會受到GPU平行加速的限制,太大可能導致在train的時候卡住不同batchsize在梯度下降上的表現GPU是如何平行加速的SaveandLoad Models
機器學習自學筆記09:Keras2.0
今日的課程來自於:https://youtu.be/5BJDJd-dzzg參考筆記:https://github.com/Sakura-gh/ML-notes/blob/master/ML-notes-pdf/10_Keras.pdf
Keras介紹
Tensorflow是目前最流行的machinelearning庫之一。
但是他沒有這麼好用tensorflow和另一個功能相近的toolkittheano,這兩個都非常flexible,可以做很多事情,deeplearning或是只做微分也行,也可以算gradientdescent等等,但是這麼flexble的toolkit學起來是一定有難度的,沒辦法在半小時內學會。
Keras是很容易學習且有足夠的彈性的,可以用來implement一個自己的deeplearning,Keras其實是tensorflow和theano的interface,所以用Keras就等於在用tensorflow,只是有人幫你把操作tensorflow這件事情幫妳寫好了。
多數想得到的nerwork,在Keras都有現成的function可以使用;因為它背後就是tensorflowortheano,所以如果你想要精進自己的能力的話,你永遠可以去改Keras背後的tensorflow的code,然後做更厲害的事情
Keras實作
現在Keras已經成為Tensorflow的官方API,就像樂高一樣簡單使用的data是MNIST的Data:http://yann.lecun.com/exdb/mnist/Keras提供了自動下載MNISTdata的function:http://keras.io/datasets/
接下來就依照之前machinelearning的三個步驟 :
首先要先導入keras套件:
fromkeras.modelsimportSequential
Step1:defineasetoffunction — neural network
先建立一個model
model=Squential()
第一層hiddenlayer
之後我們要決定neuralnetwork要長甚麼樣子:假設我們想建立的有兩個hiddenlayer,每個hiddenlayer都有500個neuron
model.add(Dense(input_dim=28*28,units=500,activation='sigmoid'))
Dense表示加一個Fullyconnected的layer(也可以加別的layer)input_dim=28*28表示輸入的是一個28*28=784長度的vector,表示imageunits=500表示該層的hiddenlayer要有500個neuronactivation=’sigmoid’表示激活函數使用sigmoidfunction(還可以選其他activationfunction,比如softplus,softsign,relu,tanh,hard_sigmoid,linear …)
第二層hiddenlayer
如果要在model裡再加一個layer,就用model.add增加一個dense全連接層,包誇units和activation參數
model.add(Dense(units=500,activation='sigmoid'))
這裡不用設定input_dim,因為新增的layer的input就等於前一個layer的output所以直接設定新加的layer有500的neuron就好了
最後一層outputlayer
最後,我們希望的output為10維,所以units=10
model.add(Dense(units=10,activation='softmax'))
如果把outputlayer當作一個Multi-classclassifier的話,那activationfunction就用softmax(這樣可以讓output每一維的機率和為1)
Step2:goodnessoffunction — cross entropy
使用model.compile去定義你的lossfunction是甚麼比如你要用crossentropy的話,那你的loss參數就是categorical_crossentropy(keras裡的寫法)
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
Step3:pickthebest function
configuration(決定好怎麼做gradientdescent)
在training之前,你要先下一些configuration告訴她training的時候,你打算要怎麼做
你要定義的第一個東西是optimizer,也就是說你要用什麼樣的方式來找最好的function,雖然optimizer後面可以皆不同的方式,但是這些不同的方式,其實都是gradientdescent類似的方法
有一些方法machine會自動的,根據經驗決定learningrate的值應該是多少,所以這些方法是不需要給它learningrate的
model.compile(loss='categoricalcrossentropy',optimizer='adam',metrics=['accuracy'])
optimizer也可以使用:SGD(gradientdescent),RMSprop,Adagrad,Adadelta,Adam,Adamax,Nadam等方法,這些都是gradientdescent
training
決定好怎麼做gradientdescent之後,就是實際去做training了跑gradientdescent找最優參數,這裡使用的是model.fit的方法,要給他4個input(假設我們給了10000張image做Trainingdata)
model.fit(x_train,y_train,batch_size=100,nb_epoch=20)
x_train(trainingdata)在這個case裡,Trainingdata就是一張一張的image,需要把它存到numpyarray裡面,這個numpyarray是兩個維度的matrix。
第一個維度,表示有多少個example;第二個維度,表示你的image有多大,有幾個pixel。
所以這裡面前的狀況是,有一萬個image做trainingdata,並且每個image有28*28=784個pixel=10000行*784列y_train(trainingdata對應的label)我們期望這些image經過training,機器可以跟我們說這張image是0~9所對應其中的一個數字,所以y_train的第一個維度應該是example的數量(也就是10000),第二個維度是output的維度(也就是10)batch_size(告訴Keras我們的batch要多大)這裡batch_size=100,表示我們要把100張隨機選擇的image放到一個batch裡面,然後把所有的image分成一個個不同的batch,Keras會自動幫你完成隨機選擇image的過程,不需要自己codingnb_epoch(對所有batch的訓練要做幾次)這裡nb_epoch=20,表示要對所有的batch進行20遍gradientdescent的訓練。
每看到一個batch就update一次參數,假設現在每一個epoch裡面有100個batch,就對應著update100次參數,20個epoch就是update2000次參數。
下面有更仔細的batch&epoch的介紹
注意:若batch_size=1,那就是StochasticGradientDescent(隨機梯度下降法),這個在gradintdescent有提到,就是每次拿到一個樣本點就update一次參數,而不是每次拿到一批樣本點的error之後才去update參數,因此stochasticgradientdescent的好處就是速度比較快,雖然每次update參數的方向是不穩定的,但是天下武功,唯快不破,在別人出一拳的時候,它就已經出了100拳,所以它是比較強的。
Mini-batch
這裡有一個秘密,就是我們在做deeplearing的gradientdescent的時候,並不會真的去minimizetotalloss,那我們做的是什麼呢?我們會把Trainingdata分成一個一個的batch,比如trainingdata有10000張image,每次random選100張image作為一個batch
像gradientdescent一樣,先隨機initializenetwork的參數選第一個batch出來,然後計算這個batch裡面的所有element的totallossL’,接下來根據L’去update參數,也就是計算L’對所有參數的偏微分,然後update參數在選第二個batch出來,現在這個batch的totalloss為L’’,接下來根據L’’對所有參數的偏微分,然後update參數反覆做上面的動作,直到所有的batch都選過一次。
所以假設你有100個batch的話,你就把這個參數update100次,把所有的batch看過一次,這就叫做一個epoch(全部的batch為一個epoch)重複epoch的過程,所以你在trainnetwork的時候,你會需要好幾個epoch,而不是只有一個epoch
整個訓練的過程類似於stochasticgradientdescent,不是將所有數據讀完才開始做gradientdescent的,而是拿到一部份數據就做一次gradientdescent
BatchsizeandTraining Speed
接下來來討論設定batchsize對trainingspeed的影響
batchsize太小會導致不穩定,速度上也沒有優勢
前面提到stochasticgradientdescent,速度快,表現好。
那為何還要使用Mini-batch?這就提到了一些操作上的問題,我們必須使用Mini-batch
舉例來說現在有50000個example,分成兩種狀況。
如果batchsize=1,也就是stochasticgradientdescent,那在一個epoch裡面,就會update50000次參數。
如果batchsize=10,在一個epoch裡面,就會update5000次參數。
看起來stochasticgradientdescent的速度會比較快,實際上batchsize設置不一樣的話,一個epoch需要的時間是不一樣的。
以GTX980為例,下圖是對總是為50000筆的trainingdata設置不同的batchsize時,每一個epoch所需的花費時間
case1:如果batchsize=1,也就是stochasticgradientdescent,一個epoch要花費166秒case2:如果batchsize=10,一個epoch要花費17秒
而第二個需要跑10個epoch,花費時間約為170秒。
如果不同batchsize的情況,update參數的次數幾乎是一樣的。
在這個case中,會更傾向選擇batchsize=10,因為會比batchsize=1更穩定(較穩,又update次數多)。
因為由更大的數據集計算的梯度能更好的代表樣本總體,從而更準確的朝向極值所在的方向。
Batchsize會受到GPU平行加速的限制,太大可能導致在train的時候卡住
上面的例子的現象產生的原因是我们用了GPU,用了平行運算,所以batchsize=10,這十個example是同時運算的,所以你在一個batch裡算10個example的時間跟算一個example的時間幾乎可以是一樣的
那你可能會問,既然batchsize越大,它會越穩定,-而且還可以平行運算,那為什麼不把batchsize變得超級大呢?這兩有兩個說明:
如果你把batch開到很大,最終GPU會無法平行運算,它是有極限的。
也就是說同時考慮10個example和1個example的時間是一樣的。
但是跑10000個就不可能跟一個example一樣。
因為batchsize需要考慮到硬件限制。
如果把batchsize設的很大,在traingradientdescent的時候,可能跑兩下network就卡住了,就縣道saddlepoint或者localminimal因為在neuralnetwork的errorsurface上面,如果你把loss的圖像可視化出來,它並不是一個convex的optimizationproblem,不會像理想中那麼光滑如果batchsize很大,甚至是fullbatch,那你走過的路徑會是比較平滑連續的,可能這一條平滑的曲線在走向最低點的過程中就會在坑洞或緩坡上卡住了;如果batchsize沒有這麼大,意味著你走的路線沒有這麼光滑,有些步伐是隨機性的,路徑會有一些曲折和波動可能在你走的過程中,它的曲折和波動剛好使得你“繞過”了那些saddlepoint或是localminima的地方;或者當你陷入不是很深的localminima或者没有遇到特别麻煩的saddlepoint的時候,它步伐的隨機性就可以幫你跳出這個gradient接近於0的區域,於是你更有可能真的走向globalminima的地方
對於Fullbatch的情况,它的路徑是没有隨機性的,是穩定朝著目標下降的,因此在這個時候去trainneuralnetwork其實是有問題的,可能update兩三次参數就會卡住,所以minibatch是有必要的
不同batchsize在梯度下降上的表現
如下圖,左邊是fullbatch(全部的trainingdata做一個batch)的梯度下降效果,可以看到每一次跌代成本函數都呈現下降趨勢,這是好的現象,說明我們的w和b的設定一直再減少誤差,這樣一直跌代下去就可以找到最佳解;右邊是minibatch的梯度下降效果,它是上下波動的,成本函數的值有時高有時低,但總體還是呈現下降的趨勢,這個也是正常的,因為我們每一次梯度下降都是在minibatch上跑的而不是在整個數據集上,數據的差異可能會導致這樣的波動,但沒關係,因為它整體是呈下降趨勢的。
把下圖看做是梯度下降空間:藍色部分是fullbatch而紫色部分是minibatch,就像上面所说的minibatch不是每次迭代損失函數都會減少,所以看上去好像走了很多彎路,不過整體還是朝著最優解迭代的,而且由於minibatch一個epoch就走了5000步(5000次梯度下降),而fullbatch一個epoch只有一步,所以雖然minibatch走了彎路但還是會快很多
minibatch在update的過程中,步伐具有隨機性,因此紫色的路徑可以在一定程度上繞過或跳出saddlepoint、localminima這些gradient趨近於0的地方;而藍色的路徑因為缺乏隨機性,只能按照既定的方式朝著目標前進,很有可能就在中途被卡住,永遠也跳不出来了
當然,就像之前討論的一樣,如果batchsize太反而會造成速度不僅没有加快反而會導致下降的曲線更加不穩定的情况產生
因此batchsize既不能太大,因為它會受到硬體GPU平行加速的限制,導致update次數過於緩慢,並且由於缺少隨機性而很容易在梯度下降的過程中卡在saddlepoint或是localminima的地方(極端情况是Fullbatch);而且batchsize也不能太小,因為它會導致速度優勢不明顯的情况下,梯度下降曲線過於不穩定,算法可能永遠也不會收斂(極端情况是Stochasticgradientdescent)
GPU是如何平行加速的
整個network,不管是Forwardpass還是Backwardpass,都可以看做是一連串的矩陣運算的结果
那今天我們就可以比較batchsize等於1(stochasticgradientdescent)和10(minibatch)的差别
如下圖所示,stochasticgradientdescent就是對每一個inputx進行單獨運算;而minibatch,則是把同一個batch裡面的input全部集合起来,假設現在我們的batchsize是2,那minibatch每一次運算的input就是把黃色的vector和綠色的vector拼接起來變成一個matrix,再把這個matrix乘上w1,你就可以直接得到z¹和z²
這兩件事在理論上運算量是一樣多的,但是在實際操作上,對GPU來說,在矩陣裡面相乘的每一個element都是可以平行運算的,所以圖中stochasticgradientdescent運算的時間反而會變成下一minibatch使用GPU運算速度的兩倍,這就是為甚麼我們要使用minibatch的原因
SaveandLoad Models
Keras也是可以幫你save和loadmodel的,你可以把train好的model存起來,以後再用另一個程式讀出來,它也可以幫你做testing
那要如何用neuralnetwork去testing呢?有兩個case:
case1:Evaluation。
比如今天有一組testingset,testingset的答案也是已知的,那Keras就可以幫你算現在的正確率有多少。
這個model.evaluates有兩個input,就是testing的image(x_test)和testing的label(y_test)
score=model.evaluation(x_test,y_test)print('TotallossonTestingSet:',score[0])print('AccuracyofTestingSet',score[1])
case2:Predicion。
這個時候model.perdict函數的input只有imagedata而沒有任何的labeldata,output就直接是分類結果
result=model.predict(x_test)
分享此文:TwitterFacebook請按讚:喜歡正在載入...
相關
KerasMiniBatchTrainingSpeed李宏毅機器學習
0comment
0
FacebookTwitterPinterestEmail
wenwu
離開學校之後,需要一點激勵來持續學習的動力。
想到什麼寫什麼,趁著還沒忘記之前通通都寫下來。
previouspost
[SAS]Logisticregression羅吉斯迴歸單變項與多變項羅吉斯迴歸
nextpost
ConvolutionalNeuralnetwork卷積神經網路(part1)
RelatedArticles
Unsuperv...
2021-07-22
Unsuperv...
2021-07-12
Unsuperv...
2021-05-20
Unsuperv...
2021-05-12
MatrixF...
2021-04-30
Unsuperv...
2021-04-16
無監督式學習Un...
2021-03-17
Semi-sup...
2021-03-03
WhyDeep...
2020-12-18
Tipsfor...
2020-12-16
發表迴響 取消回覆
近期文章
[閱讀心得#17]起床後的黃金1小時
[閱讀心得#16]這輩子,只能這樣嗎?
[閱讀心得]大量閱讀是什麼感覺?
[好物分享]威爾升降桌你的居家辦公好幫手(文章內提供100折價優惠!)
[閱讀心得#15]打開網路就有錢給經營自媒體的最佳指南
近期留言「Drama」於〈[SAS]存活分析(2)COXregressionmodel〉發佈留言「wenwu」於〈[SAS]存活分析(2)COXregressionmodel〉發佈留言「drama」於〈[SAS]存活分析(2)COXregressionmodel〉發佈留言「wenwu」於〈[SAS]存活分析(1)KM存活曲線Kaplan-MeierMethod〉發佈留言「Judy」於〈[SAS]存活分析(1)KM存活曲線Kaplan-MeierMethod〉發佈留言免費訂閱
不定期更新文章,點一下追蹤就能夠收到最新文章!
一起加入其他11位訂閱者的行列
電子郵件位址
訂閱
Statistics最後30天瀏覽:8,497總瀏覽次數:97,348總計文章:62
R線上課程參考
%d位部落客按了讚:
延伸文章資訊
- 1史上最完整機器學習自學攻略!我不相信有人看完這份不會把它 ...
這部分內容來自Nick McClure的電子書《TensorFlow Machine Learning Cookbook》。 2.3 Tensorflow-101教程部分. 這是一個用Pytho...
- 2Machine learning education | TensorFlow
Start your TensorFlow training by building a foundation in four learning areas: coding, math, ML ...
- 3NO.1:自學tensorflow之路------神經網絡背景知識 - 程式人生
手頭只有一本《tensorflow:實戰Google深度學習框架》,而這本書又講的非常粗淺。tensorflow中文社區中的翻譯的谷歌官方教程十分詳細,是自學tensorflow的 ...
- 4TensorFlow自学:当你从小白开始自己搭建一个神经网络
一. 前文Hello TensorFlow!TensorFlow,文章目录一. 前文前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要 ...
- 5TensorFlow机器学习入门教程 - 我要自学网
本套TensorFlow入门视频教程采用“理论+实例”的形式,语言通俗易懂、由浅入深、循序渐进,旨在帮助大家高效、便捷地学习TensorFlow的原理和应用。课程一共分为7章。