文章目錄
- 動機
- 重要的 API
-
- 如何使用
- 舉一反三
- 如何把 KerasClassifier 當作一個 estimator
-
- 什麼是 estimator
- 神經網絡模型作為 estimator
-
- 訓練
- 測試
- predict()
- 大功告成
動機
你是否有過這種感覺:
- 想通過
裡面內建的方法對sklearn
構造的模型進行網格搜尋或者是和決策樹、随機森林的模型做對比和融合,但是苦于他們的類型不一緻,沒辦法進行共同的操作。keras
如果你也是這樣感覺的,那麼這篇文章會帶你打破
keras
建構的神經網絡模型和
sklearn
中繼承的傳統機器學習模型的壁壘,讓他們更加緊密地關聯
重要的 API
-
就是一個專門和 sklearn 做相容的庫keras.wrappers.scikit_learn
- 裡面包含的最重要的内容:
-
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
- 當采用交叉驗證進行模型的精度測試的時候,這個
就是也是一個意思,比如 決策分類樹、決策回歸樹、随機森林分類器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