keras 修仙筆記一


對於牛逼的程序員,人家都喜歡叫他大神;因為大神很牛逼,人家需要一個小時完成的技術問題,他就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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM