教學文件

首頁>教學文件>Keras 基礎篇
Keras 基礎篇2017-08-01回索引頁

這邊要跟大家介紹Keras這個深度學習(deep learning)的套件。Keras是一款建立在Theano或Tensorflow上的高層神經網路API。相較於TensorFlow與pytorch等套件,keras更適合想快速體驗機器學習的初學者。

根據官方網站,keras的設計理念是一款基於

  • 使用者友善
  • 模組化
  • 易擴展
  • 基於python

因為keras是高層的神經網路API,較不適合做一些底層的更動,也較難深度的去學習神經網路背後的原理,筆者在這邊建議,若是已有深度學習的基礎,又或者是時間較為充裕者,可以前往Tensorflow又或者是pytorch的教學。

0. 安裝

在這邊推薦大家使用OSX或是Linux來運行keras,雖然在windows的環境下依然可以運行keras,但在安裝上需要依賴過多,與對gpu、記憶體控管等等的支持較差,易照成不可預期的錯誤。

在這我們使用python3與Tensorflow backend進行教學

i. Install on OSX/Linux

在安裝keras前,請先安裝Tensorflow
安裝的方法請見Tensorflow基礎篇

在你的終端機(terminal)輸入

###安裝keras
sudo pip3 install keras
###安裝存儲model的套件
sudo pip3 install h5py

ii. Install on Windows

筆者再一次建議大家盡量別在Windows下運行keras,若是不熟悉Linux的使用,大家可以在Windows下寫code,再將code傳到Linux上去運行。

詳細安裝方法:Windows環境下使用Anaconda執行Python環境

1. HELLO, KERAS!

在這邊我們先簡單地教大家如何搭起自己的第一個神經網路,我們在此使用MNIST的手寫數字辨識作為大家的hello keras教學。

MNIST是一個手寫數字的資料包,分成訓練資料(training data)與測試資料(testing data),x為圖片、y為所對應數字。

第一步,我們要先將MNIST的資料載入,並且進行標準化(normalization)。

載入的x為大小為28*28的圖片共60000張,且每個像素的數值介於0~255之間,標準化後介於0~1之間。

載入的y為所對應的數字0~9,在這我們要運用keras中的np_utils.to_categorical將y轉成one-hot的形式,在這我們將他轉為一個10維的vector,

ex. 我們所拿到的資料為y=3,經過np_utils.to_categorical,會轉換為y=[0,0,0,1,0,0,0,0,0,0]
from keras.datasets import mnist
from keras.utils import np_utils

def load_data():
        # 載入minst的資料
	(x_train, y_train), (x_test, y_test) = mnist.load_data()
        # 將圖片轉換為一個60000*784的向量,並且標準化
        x_train = x_train.reshape(x_train.shape[0], 28*28)
        x_test = x_test.reshape(x_test.shape[0], 28*28)
        x_train = x_train.astype('float32')
        x_test = x_test.astype('float32')
        x_train = x_train/255
        x_test = x_test/255
        # 將y轉換成one-hot encoding 
        y_train = np_utils.to_categorical(y_train, 10)
        y_test = np_utils.to_categorical(y_test, 10)
        # 回傳處理完的資料
        return (x_train, y_train), (x_test, y_test)

第二步,讀完MNIST的資料後,我們就可以來開始搭建我們的神經網路了,這裡以最簡單的DNN (deep neural network) 作為範例。

Keras的核心為模型,最主要也是最常使用的是Sequential這個模型,Sequential可以讓我們按照順序的將神經網路串起。

運用.add()我們可以一層一層的將神經網路疊起。在每一層之中我們只需要簡單的設定每層的大小(units)與激活函數(activation function)。
需要特別記得的是:第一層要記得寫輸入的向量大小、最後一層的units要等於輸出的向量大小

在這邊我們最後一層使用的激活函數(activation function)為softmax。

import numpy as np
from keras.models import Sequential
from keras.layers.core import Dense,Activation
from keras.optimizers import  Adam

def build_model():
        #建立模型
        model = Sequential()
        #將模型疊起
        model.add(Dense(input_dim=28*28,units=500,activation='relu'))
        model.add(Dense(units=500,activation='relu'))
        model.add(Dense(units=500,activation='relu'))
        model.add(Dense(units=10,activation='softmax'))
        model.summary()
        return model

第三步,疊完模型後我們就可以開始訓練模型了。
在此我們使用了Adam做為我們的優化器,loss function選用了categorical_crossentropy。

(x_train,y_train),(x_test,y_test)=load_data()
model = build_model()
#開始訓練模型
model.compile(loss='categorical_crossentropy',optimizer="adam",metrics=['accuracy'])
model.fit(x_train,y_train,batch_size=100,epochs=20)
#顯示訓練結果
score = model.evaluate(x_train,y_train)
print ('\nTrain Acc:', score[1])
score = model.evaluate(x_test,y_test)
print ('\nTest Acc:', score[1])

2. WHY KERAS

以Keras作為Tensorflow的接口,可以說是大大的降低了神經網路的入門門檻,對於初學者來說可以大大的降低疊出一個神經網路的時間,使用上極為方便。

雖然因為過度的包裝,使用上不如其他底層框架來得靈活,但事實上對於競賽、實用上已經綽綽有餘,前陣子由台灣人在kaggle上贏得的競賽–NOAA Fisheries Steller Sea Lion Population Count,就是使用了Keras作為框架

就如同先前所說,對於第一次接觸神經網路的參賽者們,Keras會是你踏進深度學習世界的一個好選擇。但對於想更深入理解這黑盒子背面的原理者,還是推薦大家可以前往Tensorflow或者是pytorch的教學,不管是在運行速度,又或是這次比賽使用seq2seq model的靈活度上,都會遠遠勝於Keras的使用喔~~

作者:台大電機二 劉記良