天天看點

keras學習之:對接 sklearn——将 keras 建構的網絡模型可以和 sklearn中的 生成樹,随機森林 等一樣進行網格搜尋和評估動機重要的 API如何把 KerasClassifier 當作一個 estimator大功告成

文章目錄

  • 動機
  • 重要的 API
    • 如何使用
    • 舉一反三
  • 如何把 KerasClassifier 當作一個 estimator
    • 什麼是 estimator
    • 神經網絡模型作為 estimator
      • 訓練
      • 測試
      • predict()
  • 大功告成

動機

你是否有過這種感覺:

  • 想通過

    sklearn

    裡面內建的方法對

    keras

    構造的模型進行網格搜尋或者是和決策樹、随機森林的模型做對比和融合,但是苦于他們的類型不一緻,沒辦法進行共同的操作。

如果你也是這樣感覺的,那麼這篇文章會帶你打破

keras

建構的神經網絡模型和

sklearn

中繼承的傳統機器學習模型的壁壘,讓他們更加緊密地關聯

重要的 API

  • keras.wrappers.scikit_learn

    就是一個專門和 sklearn 做相容的庫
  • 裡面包含的最重要的内容:
    • KerasClassifier(build_fn)

    • KerasRegressor(build_fn)

如何使用

在這裡隻示範第一種

KerasClassifier(build_fn)

如何與

sklearn

進行相容的,

KerasRegressor(build_fn)

也差不多

  • build_fn

    這個參數是一個函數,這個函數要描述你通過

    keras

    構造網絡的過程,包括了網絡的編譯過程,即下面的例子:
def make_model():
    inputs = Input((1024,))
    # x = Dense(512,activation="relu")(inputs)
    # x = BatchNormalization()(x)
    # x = Dropout(0.1)(x)
    x = Dense(256,activation="relu")(inputs)
    x = BatchNormalization()(x)
    x = Dropout(0.3)(x)
    x = Dense(128,activation="relu")(x)
    x = BatchNormalization()(x)
    x = Dropout(0.3)(x)
    x = Dense(64,activation="relu")(x)
    x = BatchNormalization()(x)
    x = Dropout(0.3)(x)
    x = Dense(32,activation="relu")(x)
    x = BatchNormalization()(x)
    x = Dropout(0.3)(x)
    x = Dense(3,activation="softmax")(x)
    model = Model(inputs,x)
    model.compile(optimizer=Adam(0.001),loss=keras.losses.categorical_crossentropy,metrics=["accuracy"])
    return model

model_classifier = KerasClassifier(build_fn = make_model)
model_classifier.fit(x_train,y_train,epochs=500,validation_data=(x_test,y_test))
           
  • 注意如何

    compile

    的一定要寫在這個函數裡面;
  • 這是因為

    sklearn

    的所有

    estimator

    (決策樹,随機森林等)都隻用

    fit, predict, score

    接口,是以我們必須在

    fit

    接口實作之前把該做的事情都做完

舉一反三

  • 如果你已經有這個網絡的模型了,該如何加載并且用于後面的預測呢。那麼就可以如下操作:當然還是把加載模型的工作定義在函數裡面咯:
def make_model():
    inputs = Input((1024,))
    # x = Dense(512,activation="relu")(inputs)
    # x = BatchNormalization()(x)
    # x = Dropout(0.1)(x)
    x = Dense(256,activation="relu")(inputs)
    x = BatchNormalization()(x)
    x = Dropout(0.3)(x)
    x = Dense(128,activation="relu")(x)
    x = BatchNormalization()(x)
    x = Dropout(0.3)(x)
    x = Dense(64,activation="relu")(x)
    x = BatchNormalization()(x)
    x = Dropout(0.3)(x)
    x = Dense(32,activation="relu")(x)
    x = BatchNormalization()(x)
    x = Dropout(0.3)(x)
    x = Dense(3,activation="softmax")(x)
    model = Model(inputs,x)
    
    model.load_weights("../../資料/medical_data/model/model.229.h5")
    model.compile(optimizer=Adam(0.001),loss=keras.losses.categorical_crossentropy,metrics=["accuracy"])
    return model

model_classifier = KerasClassifier(build_fn = make_model)
model_classifier.fit(x_train,y_train,epochs=0,validation_data=(x_test,y_test))
           
  • 注意這裡的

    fit

    中的

    epochs = 0

    這是因為;

    sklearn

    中的模型必須要經過

    fit

    這一步才能進行下面的

    predict

    score

    步驟,是以必須要

    fit

    ,但是又不能

    epoch>=1

    因為如果這樣的話,我們加載進來的參數的就會因為疊代而更新,就改變了,是以我們采取

    epochs=0

    來完成這個部分。

如何把 KerasClassifier 當作一個 estimator

什麼是 estimator

例1

  • sklearn

    中所有用于回歸和分類操作的算法,都是

    estimator

    ,比如 決策分類樹、決策回歸樹、随機森林分類器,這些都是

    estimator

    ;一個最直覺的例子就是一個随機森林分類器中可以通過

    n

    個決策分類樹進行

    bagging

    得到最佳結果,它的參數如下:
    keras學習之:對接 sklearn——将 keras 建構的網絡模型可以和 sklearn中的 生成樹,随機森林 等一樣進行網格搜尋和評估動機重要的 API如何把 KerasClassifier 當作一個 estimator大功告成
  • 這裡的每個

    estimator

    就是建立 随機森林所需要的分類器的對象,即:每一棵不同的決策樹

例2

keras學習之:對接 sklearn——将 keras 建構的網絡模型可以和 sklearn中的 生成樹,随機森林 等一樣進行網格搜尋和評估動機重要的 API如何把 KerasClassifier 當作一個 estimator大功告成
  • 當采用交叉驗證進行模型的精度測試的時候,這個

    estimator

    就是也是一個意思,比如 決策分類樹、決策回歸樹、随機森林分類器

神經網絡模型作為 estimator

  • 鋪墊了這麼多,當然不是廢話,為了把神經網絡變成一個

    estimator

    ,我們采用了

    KerasClassifier

    KerasRegressor

    ;讓我們看看怎麼用
  • 用法就簡單多了,無非也就變成了

    fit,predict,score

    這麼幾個統一的接口了;

訓練

  • 上面已經說過了,這裡面可以設定的參數和

    estimator.fit()

    略有不同,因為底層還是按照神經網絡的方式進行訓練的,是以可以指定:
    keras學習之:對接 sklearn——将 keras 建構的網絡模型可以和 sklearn中的 生成樹,随機森林 等一樣進行網格搜尋和評估動機重要的 API如何把 KerasClassifier 當作一個 estimator大功告成

測試

  • 神經網絡自己的接口應該是

    model.evaluate()

  • 但是因為轉換成了

    estimator

    是以當然也要使用

    estimator

    的接口啦

predict()

  • 這個其實适合原來神經網絡的

    predict

    有很大的不同;原本

    model.predict(x_test)

    得到的應該是一個預測的矩陣;矩陣的每一行應該是對每一個樣本的

    n

    個不同類的分類機率(在分類任務中);但是在這裡因為變成了

    estimator

    ,是以

    predict()

    的結果是一個一維的數組,每個值代表每個樣本最終分類的類别。

大功告成

  • 從此之後你就可以拿着這個

    model_classifier

    作為一個

    estimator

    去使用

    sklearn

    所有友善的評估方法啦~

繼續閱讀