深度學習(十)keras學習筆記
作者:hjimce
keras與torch7的使用非常相似,是最近才火起來的深度學習開源庫,底層是用了theano。keras可以說是python版的torch7,對於快速構建CNN模型非常方便。同時也包含了一些最新文獻的演算法,比如Batch Noramlize,文件教程也很全,在官網上作者都是直接給例子淺顯易懂,個人感覺非常容易上手。keras也支援儲存訓練好的引數,然後載入已經訓練好的引數,進行繼續訓練。
一、安裝教程。
因為keras是在theano的基礎上進行封裝的,所以我們需要先安裝好theano後,再繼續安裝keras。theano的安裝可以參考我的另外一篇博文,因為我在另外一篇博文中,是在windows環境下搭建theano的,所以這裡所講的keras的安裝也是在windows下。
其實如果在ubuntu中,theano沒有安裝也沒關係,只要使用命令:pip install keras。如果順利的話,系統會幫你把keras所有所需的庫都給安裝了,包括theano。
windows安裝步驟:
1、參考我的另外一篇博文,安裝theano,並測試沒有問題。
2、使用Anaconda,然後在命令anaconda的命令視窗中輸入:pip install keras
這個時候有可能出現h5py安裝失敗:
開啟上面的網站,找到h5py:
最後我們在anaconda的命令視窗中輸入命令:pip install h5py-2.5.0-cp27-none-win_amd64.whl 。等h5py安裝完後。在重新安裝keras輸入命令:pip install keras。
上面如果還是安裝失敗,那麼試試升級pip版本,輸入:python-m pip install --upgrade pip,把pip的版本升級一下。 二、keras 使用教程 下面貼個簡單的例子、更多的例子可以自己到官網的文件教程上看,官網給了很詳細的教程,不像caffe的文件那麼少。看一下下面例子,鬆鬆構建CNN模型。keras為我們提供了兩種網路模型.
# coding=utf-8
import numpy as np
#np.random.seed(100)
from keras.optimizers import SGD
import os
import matplotlib.pyplot as plt
import h5py
from keras.models import Sequential
from keras.layers.convolutional import Convolution2D, MaxPooling2D, ZeroPadding2D
from keras.layers.core import Dense,Dropout,Activation,Flatten
from keras.layers.normalization import BatchNormalization
from keras.optimizers import SGD, Adadelta, Adagrad,RMSprop
from keras.layers.advanced_activations import PReLU
from keras.callbacks import ModelCheckpoint,Callback
class LossHistory(Callback):
def on_train_begin(self, logs={}):
self.losses = []
def on_batch_end(self, batch, logs={}):
self.losses.append(logs.get('loss'))
def Net_Mouth():
keras_model=Sequential()#單支線性網路模型
#卷積層輸出的特徵圖為20個,卷積核大小為5*5
keras_model.add(Convolution2D(20, 5, 5,input_shape=(3, 60, 60)))#網路輸入每張圖片大小為3通道,60*60的圖片。
#啟用函式層
keras_model.add(Activation('relu'))
#最大池化層
keras_model.add(MaxPooling2D(pool_size=(2, 2)))
#卷積層,特徵圖個數為40,卷積核大小為5*5
keras_model.add(Convolution2D(40, 5, 5))
keras_model.add(Activation('relu'))
keras_model.add(MaxPooling2D(pool_size=(2, 2)))
keras_model.add(Convolution2D(60, 3, 3))
keras_model.add(Activation('relu'))
keras_model.add(MaxPooling2D(pool_size=(2, 2)))
keras_model.add(Convolution2D(80, 3, 3))
keras_model.add(Activation('relu'))
#全連線展平
keras_model.add(Flatten())
#全連線層,神經元個數為1000
keras_model.add(Dense(1000))
keras_model.add(Activation('relu'))
keras_model.add(Dense(500))
keras_model.add(Activation('relu'))
keras_model.add(Dense(38))
keras_model.add(Activation('tanh'))
#採用adam演算法進行迭代優化,損失函式採用均方誤差計算公式
keras_model.compile(loss='mean_squared_error', optimizer='adam')
return keras_model
keras_model=Net_Mouth()
#用於儲存驗證集誤差最小的引數,當驗證集誤差減少時,立馬儲存下來
checkpointer =ModelCheckpoint(filepath="mouth.hdf5", verbose=1, save_best_only=True)
history = LossHistory()
#訓練函式,對於cnn來說,網路的輸入x是(nsamples,nchanels,height,width)
#y的輸入是(nsamples,output_dimension)
keras_model.fit(x, y, batch_size=128, nb_epoch=100,shuffle=True,verbose=2,show_accuracy=True,validation_split=0.1,callbacks=[checkpointer,history])
2、圖模型,根據節點進行命名連線的一種網路結構
# coding=utf-8
import numpy as np
from keras.models import Graph
import numpy as np
np.random.seed(100)
import os
import matplotlib.pyplot as plt
import h5py
from keras.models import Graph
from keras.layers.convolutional import Convolution2D, MaxPooling2D
from keras.layers.core import Dense,Activation,Flatten, Dropout
import keras.optimizers
from keras.callbacks import ModelCheckpoint,Callback
class LossHistory(Callback):
def on_train_begin(self, logs={}):
self.losses = []
def on_batch_end(self, batch, logs={}):
self.losses.append(logs.get('loss'))
#graph 模型,下面的例子是CNN的區域性unshared weight 例子
#用於人臉五官特徵點的定位預測,採用五官區域性unshared weight
def Second_Net_Graph():
keras_model=Graph()
#網路輸入,一張圖片3通道,60*60的圖片。name表示圖模型的節點名稱,我們把第一層輸入命名為input
keras_model.add_input(name='input',input_shape=(3,60,60))
#第一個卷積層節點,我們把它命名為conv1,這一層連線到input節點上,input節點作為輸入
keras_model.add_node(layer=Convolution2D(20, 5, 5),name='conv1',input='input')
#啟用函式節點,我們把它命名為relul,這一節點連線到conv1節點上
keras_model.add_node(layer=Activation('relu'),name='relul',input='conv1')
keras_model.add_node(layer=MaxPooling2D(pool_size=(2, 2)),name='pool1',input='relul')
keras_model.add_node(layer=Convolution2D(40, 5, 5),name='conv2',input='pool1')
keras_model.add_node(layer=Activation('relu'),name='relu2',input='conv2')
keras_model.add_node(layer=MaxPooling2D(pool_size=(2, 2)),name='pool2',input='relu2')
keras_model.add_node(layer=Convolution2D(60, 3, 3),name='conv3',input='pool2')
keras_model.add_node(layer=Activation('relu'),name='relu3',input='conv3')
keras_model.add_node(layer=MaxPooling2D(pool_size=(2, 2)),name='pool3',input='relu3')
#分支,前面是權重共享,單支情況,接著到這裡,我們把它分支成幾個支路,每個分支用於預測各個五官的特徵點位置
#分支1、這個節點名字為brow_input,連線到pool3上,pool3為輸入節點
keras_model.add_node(layer=Convolution2D(80, 3, 3,activation='relu'),name='brow_input',input='pool3')
#分支2,節點名稱為eye_input,輸入節點為pool3
keras_model.add_node(layer=Convolution2D(80, 3, 3,activation='relu'),name='eye_input',input='pool3')
#分支3
keras_model.add_node(layer=Convolution2D(80, 3, 3,activation='relu'),name='nose_input',input='pool3')
#分支4
keras_model.add_node(layer=Convolution2D(80, 3, 3,activation='relu'),name='mouth_input',input='pool3')
#各個分支展平
keras_model.add_node(layer=Flatten(),name='brow_flatten',input='brow_input')
keras_model.add_node(layer=Flatten(),name='eye_flatten',input='eye_input')
keras_model.add_node(layer=Flatten(),name='nose_flatten',input='nose_input')
keras_model.add_node(layer=Flatten(),name='mouth_flatten',input='mouth_input')
#各個分支全連線
keras_model.add_node(layer=Dense(500,activation='relu'),name='brow_dense1',input='brow_flatten')
keras_model.add_node(layer=Dense(500,activation='relu'),name='eye_dense1',input='eye_flatten')
keras_model.add_node(layer=Dense(500,activation='relu'),name='nose_dense1',input='nose_flatten')
keras_model.add_node(layer=Dense(500,activation='relu'),name='mouth_dense1',input='mouth_flatten')
#各個分支的輸出
keras_model.add_node(layer=Dense(20,activation='tanh'),name='brow_dense2',input='brow_dense1')
keras_model.add_node(layer=Dense(24,activation='tanh'),name='eye_dense2',input='eye_dense1')
keras_model.add_node(layer=Dense(18,activation='tanh'),name='nose_dense2',input='nose_dense1')
keras_model.add_node(layer=Dense(38,activation='tanh'),name='mouth_dense2',input='mouth_dense1')
#inputs把各個分支得到的向量,按節點的名字,進行排放,然後作為輸出
keras_model.add_output(name='output',inputs=['brow_dense2','nose_dense2','eye_dense2',
'mouth_dense2'])
#優化方法選擇adam,損失函式選擇均方差
keras_model.compile(optimizer='adam',loss={'output':'mse'})
return keras_model
#讀取模型,並進行訓練
def train(data_file='../../h5py/train.h5'):
print 'readdata'
f=h5py.File(data_file,'r')
x=f['data'][:]
x=np.asarray(x,dtype='float32')
y=f['label'][:]
y=np.asarray(y,dtype='float32')
print x.shape
print y.shape
print 'train'
keras_model=Second_Net_Graph()
checkpointer =ModelCheckpoint(filepath="graph51point.hdf5", verbose=1, save_best_only=True)
history = LossHistory()
history = keras_model.fit({'input':x, 'output':y}, shuffle=True,verbose=2,validation_split=0.1,callbacks=[checkpointer,history])
train()
個人心得:感覺keras使用很方便,同時底層的原始碼很很容易讀懂,我們要修改演算法,可以去讀一讀底層的原始碼,學習起來不會像caffe的底層那麼麻煩,個人感覺caffe的唯一好處就是有很多公開的model、原始碼,用起來相當麻煩,keras就不一樣了,用python,搞深度學習,輕鬆許多,可惜cvpr上的一些文獻的原始碼都是用caffe寫的。期待keras像torch一樣,支援caffe模型匯入功能。
**********************作者:hjimce 時間:2015.10.1
聯絡QQ:1393852684 原創文章,轉載請保留原文地址、作者等資訊***************