を実行しているとき、私はあなたにもモデルのコールバックを使用したいときに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つしかないので