2017-04-22 1 views
1

を実行しているとき、私はあなたにもモデルのコールバックを使用したいときにKerasと交差検証を行うことができないことを読んだが、その後this postは、すべての後に可能であることを示しました。しかし、私はこれを私の文脈に取り入れるのに苦労しています。Kerasコールバッククロスバリデーション

さらに詳しく調べるには、machinelearningmastery blogに従い、the iris datasetを使用しています。

この

は3クラス分類問題であり、私は(テストのために、今の1層)多層パーセプトロンを使用しようとしています。私の目標はモデルコールバックで作業することです。その結果、ベストモデルの重みを節約できます。以下、私は私のセクション network_mlpでそれを試みます。モデルは、コールバックせずに動作することを示すために、私はまた、 network_mlp_no_callbacksが含まれます。

あなたは、何の問題/コピーしないPythonのセッションにこれを貼り付け、それを実行することができるはずです。私が見ているエラーを複製するには、最後の行のコメントを外します。

エラー:RuntimeError: Cannot clone object <keras.wrappers.scikit_learn.KerasClassifier object at 0x7f7e1c9d2290>, as the constructor does not seem to set parameter callbacks

コード:最初のセクションでは、データを読み込み、 2番目はコールバックを持つモデルで、これは動作しません。 3番目はコールバックのないモデルで、これは(コンテキストを提供するために)動作します。

#!/usr/bin/env python 

import numpy as np 
import pandas, math, sys, keras 
from keras.models import Sequential 
from keras.callbacks import EarlyStopping, ModelCheckpoint 
from keras.layers import Dense 
from keras.wrappers.scikit_learn import KerasClassifier 
from sklearn.preprocessing import MinMaxScaler 
from sklearn.model_selection import cross_val_score 
from sklearn.model_selection import KFold 
from keras.utils import np_utils 
from keras.utils.np_utils import to_categorical 
from sklearn.preprocessing import LabelEncoder 

def read_data_mlp(train_file): 
    train_data = pandas.read_csv("iris.csv", header=None) 
    train_data = train_data.values 
    X = train_data[:,0:4].astype(float) 
    Y = train_data[:,4] 
    X = X.astype('float32') 

    scaler = MinMaxScaler(feature_range=(0, 1)) 

    # encode class values as integers 
    encoder = LabelEncoder() 
    encoder.fit(Y) 
    encoded_Y = encoder.transform(Y) 
    # convert integers to dummy variables (i.e. one hot encoded) 
    dummy_y = np_utils.to_categorical(encoded_Y) 

    X_train_s = scaler.fit_transform(X) 

    return (X_train_s, dummy_y) 

def network_mlp(X, Y, out_dim=10, b_size=30, num_classes=3, epochs=10): 
    #out_dim is the dimensionality of the hidden layer; 
    #b_size is the batch size. There are 150 examples total. 

    filepath="weights_mlp.hdf5" 

    def mlp_model(): 
      model = Sequential() 
      model.add(Dense(out_dim, input_dim=4, activation='relu', kernel_initializer='he_uniform')) 
      model.add(Dense(num_classes, activation='softmax')) 
      model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 
      return model 

    checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max') 
    callbacks_list = [checkpoint] 
    estimator = KerasClassifier(build_fn=mlp_model, epochs=epochs, batch_size=b_size, verbose=0, callbacks=callbacks_list) 
    kfold = KFold(n_splits=10, shuffle=True, random_state=7) 
    results = cross_val_score(estimator, X, Y, cv=kfold) 
    print("MLP: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100)) 

    return 0 

def network_mlp_no_callbacks(X, Y, out_dim=10, b_size=30, num_classes=3, epochs=10): 

    def mlp_model(): 
      model = Sequential() 
      model.add(Dense(out_dim, input_dim=4, activation='relu', kernel_initializer='he_uniform')) 
      model.add(Dense(num_classes, activation='softmax')) 
      model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 
      return model 

    estimator = KerasClassifier(build_fn=mlp_model, epochs=epochs, batch_size=b_size, verbose=0) 
    kfold = KFold(n_splits=10, shuffle=True, random_state=7) 
    results = cross_val_score(estimator, X, Y, cv=kfold) 
    print("MLP: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100)) 

    return 0 

if __name__=='__main__': 

    X, Y = read_data_mlp('iris.csv') 
    network_mlp_no_callbacks(X, Y, out_dim=10, b_size=30, num_classes=3, epochs = 10) 
    #network_mlp(X, Y, out_dim=10, b_size=30, num_classes=3, epochs = 10) 

質問:どのようにモデルコールバックをKerasClassifierに組み込むことができますか?彼らはいくつかの推定量を使用していて、1つしかないので

答えて

1

ソリューションは、あなたが参照する他の回答にかなり近いが、若干異なっています。 fit_params={'callbacks': callbacks_list}cross_val_scoreコールに追加し、コールバックリストをestimator初期化から削除し、save_best_onlyFalseに変更することで、チェックポイント機能が働きました。

だから今network_mlpのコードのサブセクションでは、次のようになります。あなたは、ニューラルネットワーク用に設定検証スプリットを持っていないので、val_accが利用できないため

checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=False, mode='max') 
callbacks_list = [checkpoint] 
estimator = KerasClassifier(build_fn=mlp_model, epochs=epochs, batch_size=b_size, verbose=0) 
kfold = KFold(n_splits=10, shuffle=True, random_state=7) 
results = cross_val_score(estimator, X, Y, cv=kfold, fit_params={'callbacks': callbacks_list}) 

save_best_only=Falseが必要です。検証サブ分割を使用する場合は、推定器の初期化を次のように変更できます。

estimator = KerasClassifier(build_fn=mlp_model, epochs=epochs, batch_size=b_size, verbose=0, validation_split=.25) 

幸いです!