對於牛逼的程序員,人家都喜歡叫他大神;因為大神很牛逼,人家需要一個小時完成的技術問題,他就20分鍾就搞定。Keras框架是一個高度集成的框架,學好它,就猶如掌握一個法寶,可以呼風喚雨。所以學keras 猶如在修仙,呵呵。請原諒我無厘頭的邏輯。
Kera是一個高度集成化的框架,面向高層的抽象,他是python語言寫的,同時也可以運行在tensorflow或者cntk之上(即后台運行可以是tensorflow或者cntk),他可以快速的構建你的機器學習模型,但也因為高度封裝的原因,也會失去一些改寫的靈活性。
首先來看看導入的類,可以有哪些:
import numpy as np #import tensorflow as tf from keras import layers from keras.layers import Input, Dense, Activation, ZeroPadding2D, BatchNormalization, Flatten, Conv2D from keras.layers import AveragePooling2D, MaxPooling2D, Dropout, GlobalMaxPooling2D, GlobalAveragePooling2D from keras.models import Model from keras.preprocessing import image from keras.utils import layer_utils from keras.utils.data_utils import get_file from keras.applications.imagenet_utils import preprocess_input import pydot from IPython.display import SVG from keras.utils.vis_utils import model_to_dot from keras.utils import plot_model from kt_utils import * import keras.backend as K K.set_image_data_format('channels_last') import matplotlib.pyplot as plt from matplotlib.pyplot import imshow %matplotlib inline
尤其是
from keras.layers import Input, Dense, Activation, ZeroPadding2D, BatchNormalization, Flatten, Conv2D
from keras.layers import AveragePooling2D, MaxPooling2D, Dropout, GlobalMaxPooling2D, GlobalAveragePooling2D
這樣的函數,順手捏來就可以使用了。就像一些積木似的,可以用來快速成型。
現在有一個例子:
就是有人組織一場party,到場參加的必須是帶着笑容了,因為門口有攝像頭,通過攝像頭會識別來的人是否是帶着笑容的,如果是,則自動開門放行,如果不是則不會開門。
第一步:參數的初始化(模擬數據)
def mean_pred(y_true, y_pred): return K.mean(y_pred) def load_dataset(): train_dataset = h5py.File('datasets/train_happy.h5', "r") # h5py 是一種數據存儲格式 train_set_x_orig = np.array(train_dataset["train_set_x"][:]) # your train set features train_set_y_orig = np.array(train_dataset["train_set_y"][:]) # your train set labels test_dataset = h5py.File('datasets/test_happy.h5', "r") test_set_x_orig = np.array(test_dataset["test_set_x"][:]) # your test set features test_set_y_orig = np.array(test_dataset["test_set_y"][:]) # your test set labels classes = np.array(test_dataset["list_classes"][:]) # the list of classes train_set_y_orig = train_set_y_orig.reshape((1, train_set_y_orig.shape[0])) test_set_y_orig = test_set_y_orig.reshape((1, test_set_y_orig.shape[0])) return train_set_x_orig, train_set_y_orig, test_set_x_orig, test_set_y_orig, classes
小測:
X_train_orig, Y_train_orig, X_test_orig, Y_test_orig, classes = load_dataset() # Normalize image vectors X_train = X_train_orig/255. X_test = X_test_orig/255. # Reshape Y_train = Y_train_orig.T Y_test = Y_test_orig.T print ("number of training examples = " + str(X_train.shape[0])) print ("number of test examples = " + str(X_test.shape[0])) print ("X_train shape: " + str(X_train.shape)) print ("Y_train shape: " + str(Y_train.shape)) print ("X_test shape: " + str(X_test.shape)) print ("Y_test shape: " + str(Y_test.shape))
圖片是(64,64,3)
訓練集 600張
測試集 150張
第二步:用keras建立模型
根據keras的快速原型:這些方法都是在導入keras時候導入的 def model(input_shape): X_input = Input(input_shape) # 底層是tensorflow ,其實是創建placeholder存放變量 X=ZeroPadding2D((3,3))(X_input) # 建立padding畫布,主要適配不同圖片尺寸或者避免邊緣特征磨損的情況 X=Conv2D(32,(7,7)),strides=(1,1),name=’conv0’)(x) ##32 是過濾核的數量;(7,7)是過濾核的寬度和高度,strides是卷積的部長,name是對其進行命名 X = BatchNormalization(axis = 3, name = 'bn0')(X) #規范化,控制過擬合 X=Activation(‘relu’)(x) #激活函數 X=MaxPooling2D((2,2),name=’max_pool’)(x) #池化 X = Flatten()(X) #全連接,多維轉為一維 X=Dense(1,activation=’sigmoid’,name=’fc’)(x) #激活函數,和全連接 model=Model(input=X_input,outputs=X,name=’HappyModel’) return model
在上面給出的模型中,我們可以看到都一直都用X作為變量,其實這個無所謂了,因為底層已經根據給出的別名X,Z1,A1,Z2,A2等已經賦值並緩存起來了。而這些方法都是前面導入的函數:
from keras.layers import Input, Dense, Activation, ZeroPadding2D, BatchNormalization, Flatten, Conv2D
接下來,我們組裝一個模型:
def HappyModel(input_shape): X_input = Input(shape=input_shape) X = ZeroPadding2D(padding=(1,1))(X_input) X=Conv2D(8,kernel_size=(3,3),strides=(1,1))(x) X=BatchNormalization(axis=3)(x) X=Activation(‘relu’)(X) X=MaxPooling2D(pool_size=(2,2),strides=(2,2),padding=’valid’)(x) #FC X=Flatten()(X) Y=Dense(1,activation=’sigmoid’)(x) Model = Model(inputs=X_input,outputs=Y,name=’HappyModel’) Return model
第三步:訓練模型
在下面訓練模型的過程可分為
1) 創建模型 (如上代碼)
2) 編譯模型,使用到函數 model.compile(optimizer=”..”,loss=”..’’,metrics=[“accuracy”])
3) 訓練模型,通過調用model.fit(x=…,y=…,epochs=…,batch_size=…)
Batch_size:批次數,就是每次有多少個樣例參與訓練,每次訓練迭代epochs次
Batch_Size 太小,算法在 200 epoches 內不收斂。
•隨着 Batch_Size 增大,處理相同數據量的速度越快。
•隨着 Batch_Size 增大,達到相同精度所需要的 epoch 數量越來越多。
•由於上述兩種因素的矛盾, Batch_Size 增大到某個時候,達到時間上的最優。
由於最終收斂精度會陷入不同的局部極值,因此 Batch_Size 增大到某些時候,達到最終收斂精度上的最優。如果內存不足,需要把batch_size 設置小一點
4) 測試模型的數據通過調用 model.evaluate(x=…,y=…)
具體的使用可以參考中文keras手冊:
http://keras-cn.readthedocs.io/en/latest/layers/core_layer/
1) 創建模型:
happyModel = HappyModel((64, 64, 3))
2) 編譯模型:
import keras happyModel.compile(optimizer=keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0), loss='binary_crossentropy', metrics=['accuracy'])
# 優化器中Adam
# lr:大或等於0的浮點數,學習率
#beta_1/beta_2:浮點數, 0<beta<1,通常很接近1
# epsilon:大或等於0的小浮點數,防止除0錯誤
3) 訓練模型:
happyModel.fit(x=X_train, y=Y_train, batch_size=16, epochs=20)
4) 測試模型:
preds = happyModel.evaluate(x=X_test, y=Y_test) ### END CODE HERE ### print() print ("Loss = " + str(preds[0])) print ("Test Accuracy = " + str(preds[1]))
happyModel.summary() :會詳細打印出訓練的過程
第四步:實際運用
預測結果:model.predict(x) 就會打印出匹配的結果 是true 還是flase
mg_path = 'images/my_image.jpg' ### END CODE HERE ### img = image.load_img(img_path, target_size=(64, 64)) imshow(img) x = image.img_to_array(img) x = np.expand_dims(x, axis=0) x = preprocess_input(x) result = happyModel.predict(x) ###預測結果 print(result)
總結:keras訓練主要有4大步驟
Create->Compile->Fit/Train->Evaluate/Test.
創建-編譯-訓練-測試
具體的keras函數可以查看:http://keras-cn.readthedocs.io/en/latest/other
參考:基礎原理http://www.jianshu.com/p/64172378a178