2017-04-22 2 views
1

모델 콜백도 사용하려는 경우 Keras와 교차 유효성 검사를 수행 할 수는 없지만 결국 this post은 가능한 것으로 나타났습니다. 그러나, 나는 내 상황에 이것을 통합하는 데 어려움을 겪고있다.교차 유효성 검사를 실행할 때 Keras 콜백

더 자세히 살펴 보려면 machinelearningmastery blog을 따르고 the iris dataset을 사용하고 있습니다.

이것은 3 클래스 분류 문제이며, 이제는 멀티 레이어 퍼셉트론 (테스트를 위해 하나의 레이어)을 사용하려고합니다. 내 목표는 모델 콜백에서 작업하는 것이므로 최상의 모델의 가중치를 저장할 수 있습니다. 아래, 나는 나의 섹션 network_mlp에서 그것을 시도한다. 모델이 콜백없이 작동한다는 것을 보여주기 위해 network_mlp_no_callbacks도 포함됩니다.

파이썬 세션에 복사/붙여 넣기를해서 문제없이 실행할 수 있어야합니다. 내가보고있는 오류를 복제하려면 마지막 줄의 주석 처리를 제거하십시오.

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

코드 : 첫 번째 섹션은 데이터를 읽 두 번째는 작동하지 않는 콜백 모델입니다. 세 번째는 콜백이없는 모델로, (문맥을 제공하기 위해) 작동합니다.

#!/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

솔루션은 참조한 다른 답변과 상당히 유사하지만 여러 견적 도구를 사용하고있어 하나만 가지고 있기 때문에 약간 다릅니다. cross_val_score 호출에 fit_params={'callbacks': callbacks_list}을 추가하고 estimator 초기화에서 콜백 목록을 제거하고 save_best_onlyFalse으로 변경하여 검사 점 작업을 수행 할 수있었습니다. 당신이 신경 네트워크에 대한 설정 유효성 검사 분할이 없기 때문에

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이 필요하며, 따라서 val_acc을 사용할 수 없습니다 :

는 이제 network_mlp 코드의 하위 섹션은 다음과 같습니다.

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

행운을 빕니다 : 당신이 검증 하위 분할을 사용하려는 경우, 예를 들어로 추정 초기화를 변경할 수 있습니다!

관련 문제