Keras Scikit-Learn Wrapper を使用した次のコードがあります。
_from keras.models import Sequential
from keras.layers import Dense
from sklearn import datasets
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import cross_val_score
import numpy as np
def create_model():
# create model
model = Sequential()
model.add(Dense(12, input_dim=4, init='uniform', activation='relu'))
model.add(Dense(6, init='uniform', activation='relu'))
model.add(Dense(1, init='uniform', activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
def main():
"""
Description of main
"""
iris = datasets.load_iris()
X, y = iris.data, iris.target
NOF_ROW, NOF_COL = X.shape
# evaluate using 10-fold cross validation
seed = 7
np.random.seed(seed)
model = KerasClassifier(build_fn=create_model, nb_Epoch=150, batch_size=10, verbose=0)
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed)
results = cross_val_score(model, X, y, cv=kfold)
print(results.mean())
# 0.666666666667
if __name__ == '__main__':
main()
_
_pima-indians-diabetes.data
_はダウンロードできますここ。
今私がやりたいのは、_NOF_COL
_をcreate_model()
関数のパラメーターに次のように渡すことです
_model = KerasClassifier(build_fn=create_model(input_dim=NOF_COL), nb_Epoch=150, batch_size=10, verbose=0)
_
次のようなcreate_model()
関数を使用します。
_def create_model(input_dim=None):
# create model
model = Sequential()
model.add(Dense(12, input_dim=input_dim, init='uniform', activation='relu'))
model.add(Dense(6, init='uniform', activation='relu'))
model.add(Dense(1, init='uniform', activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
_
しかし、このエラーが発生して失敗します:
_TypeError: __call__() takes at least 2 arguments (1 given)
_
それを行う正しい方法は何ですか?
input_dim
KerasClassifier
コンストラクターへのキーワード引数:
model = KerasClassifier(build_fn=create_model, input_dim=5, nb_Epoch=150, batch_size=10, verbose=0)
最後の答えはもう機能しません。
代わりに、KerasClassifier build_fnは関数を想定しているので、create_modelから関数を返します。
def create_model(input_dim=None):
def model():
# create model
nn = Sequential()
nn.add(Dense(12, input_dim=input_dim, init='uniform', activation='relu'))
nn.add(Dense(6, init='uniform', activation='relu'))
nn.add(Dense(1, init='uniform', activation='sigmoid'))
# Compile model
nn.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
return nn
return model
または documentation によるとさらに良い
sk_paramsはモデルパラメータとフィッティングパラメータの両方を取ります。法的モデルパラメータは、build_fnの引数です。 scikit-learnの他のすべての推定器と同様に、build_fnは引数にデフォルト値を提供する必要があるため、値を渡さずに推定器を作成できることに注意してくださいsk_params
したがって、次のように関数を定義できます。
def create_model(number_of_features=10): # 10 is the *default value*
# create model
nn = Sequential()
nn.add(Dense(12, input_dim=number_of_features, init='uniform', activation='relu'))
nn.add(Dense(6, init='uniform', activation='relu'))
nn.add(Dense(1, init='uniform', activation='sigmoid'))
# Compile model
nn.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
return nn
そしてラッパーを作成します:
KerasClassifier(build_fn=create_model, number_of_features=20, epochs=25, batch_size=1000, ...)