易用的深度學習框架Keras簡介及使用

Keras是基於Python的一個深度學習框架,內核採用Theano和Tensorflow,能夠進行切換。html

1. Keras簡介

Keras是基於Theano的一個深度學習框架,它的設計參考了Torch,用Python語言編寫,是一個高度模塊化的神經網絡庫,支持GPU和CPU。使用文檔在這:http://keras.io/,這個框架貌似是剛剛火起來的,使用上的問題能夠到github提issue:https://github.com/fchollet/keras python

下面簡單介紹一下怎麼使用Keras,以Mnist數據庫爲例,編寫一個CNN網絡結構,你將會發現特別簡單。git

2. Keras裏的模塊介紹

  • Optimizersgithub

    顧名思義,Optimizers包含了一些優化的方法,好比最基本的隨機梯度降低SGD,另外還有Adagrad、Adadelta、RMSprop、Adam,一些新的方法之後也會被不斷添加進來。數據庫

    keras.optimizers.SGD(lr=0.01, momentum=0.9, decay=0.9, nesterov=False)

    上面的代碼是SGD的使用方法,lr表示學習速率,momentum表示動量項,decay是學習速率的衰減係數(每一個epoch衰減一次),Nesterov的值是False或者True,表示使不使用Nesterov momentum。其餘的請參考文檔。網絡

  • Objectives框架

    這是目標函數模塊,keras提供了mean_squared_error,mean_absolute_error  
    ,squared_hinge,hinge,binary_crossentropy,categorical_crossentropy這幾種目標函數。機器學習

    這裏binary_crossentropy 和 categorical_crossentropy也就是常說的logloss.模塊化

  • Activations函數

    這是激活函數模塊,keras提供了linear、sigmoid、hard_sigmoid、tanh、softplus、relu、 softplus,另外softmax也放在Activations模塊裏(我以爲放在layers模塊裏更合理些)。此外,像LeakyReLU和 PReLU這種比較新的激活函數,keras在keras.layers.advanced_activations模塊裏提供。

  • Initializations

    這是參數初始化模塊,在添加layer的時候調用init進行初始化。keras提供了uniform、lecun_uniform、normal、orthogonal、zero、glorot_normal、he_normal這幾種。

  • layers

    layers模塊包含了core、convolutional、recurrent、advanced_activations、normalization、embeddings這幾種layer。

    其中core裏面包含了flatten(CNN的全鏈接層以前須要把二維特徵圖flatten成爲一維的)、reshape(CNN輸入時將一維的 向量弄成二維的)、dense(就是隱藏層,dense是稠密的意思),還有其餘的就不介紹了。convolutional層基本就是Theano的 Convolution2D的封裝。

  • Preprocessing

    這是預處理模塊,包括序列數據的處理,文本數據的處理,圖像數據的處理。重點看一下圖像數據的處理,keras提供了 ImageDataGenerator函數,實現data augmentation,數據集擴增,對圖像作一些彈性變換,好比水平翻轉,垂直翻轉,旋轉等。

  • Models

    這是最主要的模塊,模型。上面定義了各類基本組件,model是將它們組合起來,下面經過一個實例來講明。

3.一個實例:用CNN分類Mnist

  • 數據下載

    Mnist數據在其官網上有提供,可是不是圖像格式的,由於咱們一般都是直接處理圖像,爲了之後程序能複用,我把它弄成圖像格式的,這裏能夠下載:http://pan.baidu.com/s/1qCdS6,共有42000張圖片。

  • 讀取圖片數據

    keras要求輸入的數據格式是numpy.array類型(numpy是一個python的數值計算的庫),因此須要寫一個腳原本讀入mnist圖像,保存爲一個四維的data,還有一個一維的label,代碼:

#coding:utf-8
"""
Author:wepon
Source:https://github.com/wepe
file:data.py
"""
import os
from PIL import Image
import numpy as np
#讀取文件夾mnist下的42000張圖片,圖片爲灰度圖,因此爲1通道,
#若是是將彩色圖做爲輸入,則將1替換爲3,
#而且data[i,:,:,:] = arr改成data[i,:,:,:] = [arr[:,:,0],arr[:,:,1],arr[:,:,2]]
def load_data():
    data = np.empty((42000,1,28,28),dtype="float32")
    label = np.empty((42000,),dtype="uint8")

    imgs = os.listdir("./mnist")
    num = len(imgs)
    for i in range(num):
        img = Image.open("./mnist/"+imgs[i])
        arr = np.asarray(img,dtype="float32")
        data[i,:,:,:] = arr
        label[i] = int(imgs[i].split('.')[0])
     return data,label
  • 構建CNN,訓練

    短短二十多行代碼,構建一個三個卷積層的CNN,直接讀下面的代碼吧,有註釋,很容易讀懂:

#導入各類用到的模塊組件
from __future__ import absolute_import
from __future__ import print_function
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.advanced_activations import PReLU
from keras.layers.convolutional import Convolution2D, MaxPooling2D
from keras.optimizers import SGD, Adadelta, Adagrad
from keras.utils import np_utils, generic_utils
from six.moves import range
from data import load_data

#加載數據
data, label = load_data()
print(data.shape[0], ' samples')

#label爲0~9共10個類別,keras要求格式爲binary class matrices,轉化一下,
#直接調用keras提供的這個函數
label = np_utils.to_categorical(label, 10)

###############
#開始創建CNN模型###############
#生成一個model
model = Sequential()

#第一個卷積層,4個卷積核,每一個卷積核大小5*5。1表示輸入的圖片的通道,灰度圖爲1通道。
#border_mode能夠是valid或者full,
#具體看這裏說明:http://deeplearning.net/software/theano/library/tensor/nnet/conv.html
#theano.tensor.nnet.conv.conv2d

#激活函數用tanh
#你還能夠在model.add(Activation('tanh'))後加上dropout的技巧: model.add(Dropout(0.5))
model.add(Convolution2D(4, 1, 5, 5, border_mode='valid')) 
model.add(Activation('tanh'))

#第二個卷積層,8個卷積核,每一個卷積核大小3*3。4表示輸入的特徵圖個數,等於上一層的卷積核個數#激活函數用tanh
#採用maxpooling,poolsize爲(2,2)
model.add(Convolution2D(8,4, 3, 3, border_mode='valid'))
model.add(Activation('tanh'))
model.add(MaxPooling2D(poolsize=(2, 2)))

#第三個卷積層,16個卷積核,每一個卷積核大小3*3
#激活函數用tanh
#採用maxpooling,poolsize爲(2,2)
model.add(Convolution2D(16, 8, 3, 3, border_mode='valid')) 
model.add(Activation('tanh'))
model.add(MaxPooling2D(poolsize=(2, 2)))

#全鏈接層,先將前一層輸出的二維特徵圖flatten爲一維的。
#Dense就是隱藏層。16就是上一層輸出的特徵圖個數。
#4是根據每一個卷積層計算出來的:(28-5+1)獲得24,(24-3+1)/2獲得11,(11-3+1)/2獲得4
#全鏈接有128個神經元節點,初始化方式爲normal
model.add(Flatten())
model.add(Dense(16*4*4, 128, init='normal'))
model.add(Activation('tanh'))

#Softmax分類,輸出是10類別
model.add(Dense(128, 10, init='normal'))
model.add(Activation('softmax'))

#############
#開始訓練模型#
#############
#使用SGD + momentum
#model.compile裏的參數loss就是損失函數(目標函數)
sgd = SGD(l2=0.0,lr=0.05, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd,class_mode="categorical")

#調用fit方法,就是一個訓練過程. 訓練的epoch數設爲10,batch_size爲100.
#數據通過隨機打亂shuffle=True。verbose=1,訓練過程當中輸出的信息,0、一、2三種方式均可以,可有可無。
#show_accuracy=True,訓練時每個epoch都輸出accuracy。
#validation_split=0.2,將20%的數據做爲驗證集。
model.fit(data, label, batch_size=100,nb_epoch=10,shuffle=True,verbose=1,
show_accuracy=True,validation_split=0.2)
  • 代碼使用與結果

代碼放在我github的機器學習倉庫裏:https://github.com/wepe/MachineLearning,非github用戶直接點右下的DownloadZip。

在/DeepLearning Tutorials/keras_usage目錄下包括data.py,cnn.py兩份代碼,下載Mnist數據後解壓到該目錄下,運行cnn.py這份文件便可。

結果以下所示,在Epoch 9達到了0.98的訓練集識別率和0.97的驗證集識別率:

這裏寫圖片描述

轉載請註明出處:http://blog.csdn.net/u012162613/article/details/45397033

相關文章
相關標籤/搜索