back to index
ML Lecture 8-2: Keras 2.0

link |
好,那我們來講一下,如果在改版以後的Keras長什麼樣子。
link |
好,那現在是這個樣子了,現在是說,這個大概在你在作業三的時候,我們作業三是一個有關CNN影像辨識的作業,那所以這個時候你會先想要實作CNN,之後也會講說怎麼實作CNN,而且在助教的教學裡面,在手把手的教學裡面會教你怎麼把Keras安裝起來。
link |
那我們在講CNN之前,我們先講一下,假如你要implement一個最basic的,fully connected的v4 network,如果你用Keras的話,你要怎麼做?
link |
好,那現在假設我們要做的事情是手寫的數字辨識,那我們要多了一個network,我們要建了一個network的structure,它input是28x28的dimension,28x28的dimension意思就是說,這其實是一張image,image的解析度是28x28,我們把它拉直,變成一個長度是28x28微的向量。
link |
output呢,現在做的是手寫的數字辨識,手寫數字辨識就是input一張image要決定它是0到9的哪一個數字,所以我們的output就是每一位對應那個數字,所以output就是10位。
link |
中間,假如你要有兩個hidden layer,每一個hidden layer是500個neuron的話,那你會怎麼做呢?那如果是用Keras的話,你要宣告一個network,你的做法就是,首先你先宣告說model等於sequential。
link |
再來,你要把第一個hidden layer加進去的話,怎麼做呢?你就很簡單,你只要下add就好,下add你就add一個layer。
link |
然後add的這個指令後面呢,你加了一個dense的意思就是說,我們加的是一個fully connected的layer,如果你把dense改成別的,比如說改成convolution2D,那你就是加一個convolution的layer,所以這個其實都非常的簡單。
link |
那input dimension就是告訴我們說input dimension要是多少,那原來在Keras 1.0版裡面,output dimension,或者是說neuron的數目,它是用output dimension來表示啦。
link |
不過現在在新版裡面它改成units,我想這更直觀了,每一個neuron就是一個units,那units等於500,意思就是說我們有500個units,我們有500個neuron。
link |
好,然後接下來就是下activation function,那這邊你就看你想要選哪一個activation function都可以啦,有很多的activation function是你可以選擇的,每一個activation function都只是一個英文的詞彙,你就把那個詞彙打上去就好了。
link |
你要自己加新的activation function其實還蠻容易的,你在Keras code裡面找到它定義activation function的地方,然後就可以自己直接插新的activation function進去,這個都還蠻容易。
link |
好,那再加第二個layer,那如果加第二個layer的話,你就不需要再宣告input dimension了,因為第二個layer的input dimension就是前一個layer的units,前一個layer已經說是500個new units,所以第二個layer的input就是500,不需要再定義一次。
link |
那這邊你只需要告訴它說,接下來第二個layer有多少個units,就說units等於500,然後activation function等於,就隨便選一個你想要用的activation function,沒想要選不一樣的也都是可以的。
link |
好,最後一個layer,因為output有10個數字,所以最後一個layer的output一定要是10維,你說11或9都是不行的,就是10個數字,所以就是10維,所以units就是10,activation function,這邊你其實選別的compile也會過,
link |
不過我們通常會選softmax,如果選softmax的話,意味著output的每一個dimension只會介於0到1之間,然後它的總和是1,你就可以把它當作一個很像機率的東西來看待。
link |
那softmax在前面的課程裡面其實也是講過了。
link |
好,再來第二個步驟,你要做一下configuration,這邊包括了你要定義loss function,你就下model.compile,然後loss等於什麼東西,然後選一個你自己喜歡的loss function,那有非常多不同的可能的選擇。
link |
好,那你要選一個optimizer,那其實所有的optimizer都是那個gradient descent base的啦,那你下不同的英文單字只是有不同的方法來幫你決定你的learning rate,像我們之前已經知道了一個adagram的做法,那其實還有很多其他的做法。
link |
好,再來呢,下完configure以後你就可以開始train你的network,那train你的network其實非常簡單,就是一行,雖然說backpropagation是一個很複雜的東西,但是其實當你在用這些deep learning framework的時候,就是一行。
link |
好,所以你就call model.fit,它就開始用gradient descent幫你去train你的network,那你要給它你的training data,你要給它你的training data的input,還有你的training data的label。
link |
那這邊這個Xtrain代表了image,Ytrain代表這些image的label,我們現在做的是手寫的數字辨識,那input就是那些手寫數字的image,而label就是每一張image它實際上對應的數字是哪一個。
link |
那batch size跟apocs我們今天就不解釋,那其實在video裡面已經有解釋過了。好,那有關Xtrain跟Ytrain的格式,我想這個對大家來說應該也不是太難的問題,這個Xtrain跟Ytrain你都必須要存成non-pi的array,你就不要問我說要怎麼把image存成non-pi的array,這個是你的責任。
link |
好,那這個non-pi的array長什麼樣子呢?現在在我們等一下要示範的這個task裡面,第一個軸代表的是有幾個training sample,所以第一個軸如果是一萬位,代表說有一萬個training sample。
link |
第二個軸呢?第二個軸代表了說現在每一個example,每一個image,我們用多長的vector來表示它,我們用多少的數字來表示一個image,那這邊是有28x28,也就是784位vector來表示每一張image。
link |
所以這個Xtrain它就是一個matrix,這個matrix的其中一維代表了這個training sample的數目,另外一維代表了每一個example它用多少的數值來表示。
link |
好,那在Ytrain的部分,在Label的部分,怎麼表示你的Label呢?這邊的做法是Label也存成一個二維的matrix,第一個維度一樣代表了training sample數目,第二個維度代表了現在總共有多少個不同的class。
link |
現在因為總共有十個不同的class,就是0到9,所以第二個維度的長度就是10。那對每一個example來說,它的這個vector都是只有一維是1,其他都是0,只有一維是1,其他都是0。
link |
1的部分這邊就用黑色來表示,那每一維就對應那個數字,那這邊是從0開始算,0、1、2、3、4、5開始算。今天如果說第一張image對應的是數字5,那就是對應到數字5的那個dimension,它的值是1,其他dimension就是0。
link |
原來在這邊實際算算看,從0開始算,0、1、2、3、4、5,它確實是對應到5的那個維度的數字是1,其他是0,就代表說第一張image它是數字5。
link |
第二張image是數字0,所以就對應到0那個維度是1,其他是0。或是你看第四張image數字1,那就對應到數字1的那個維度是它的值放1,其他維度值就放0。
link |
接下來算完以後,你就得到一個model,你可以把model存起來,然後之後再把它讀出來,那這個部分就大家自己參考一下Keras的說明,它這個documentation的說明。
link |
好,那接下來你要拿這個network來真的使用,使用有兩個不同的情境,這兩個不同的情境,一個是叫做evaluation,所以evaluation的意思就是說,你實際上有testing data的level,你只想要知道說你的model在testing data上表現的到底怎麼樣。
link |
這時候你就call evaluation這個function,然後你就把training data的image跟training data的level丟給evaluation這個function,它就自動幫你算出你的model的正確率。
link |
那它會output一個這個二維的向量,這邊就寫作score,那這個二維向量的第一個維度代表了在testing set上的loss,第二個維度代表在testing set上的accuracy。
link |
這跟accuracy的值是不一樣的,大家可以了解吧,你算loss的時候,你可能用cross entropy,可能用mean square error,那你算出來是cross entropy的mean square error,accuracy是對與不對,那你會量出一個正確率,所以這兩個值是不一樣的。
link |
好,第二個case是做predict,所謂做predict的意思是說,你現在的系統真正上線了,你沒有正確答案,你真的要拿你這個系統來做手寫數字辨識,使用者真的輸給你一個手寫數字的圖片,你要真的去預測它的結果是多少,真的得到network的output。
link |
那這個時候呢,你沒有正確答案,所以你只有把x-tags把input丟進去,這個時候你要call predict這個function。