新类中的KerasClassifier无法正常运行

时间:2020-05-26 12:46:09

标签: keras

我正在使用KerasClassifier创建一个NN,通常,在使用.fit()之后,该对象仍将保留wrappers.scikit_learn.KerasClassifier的类型,然后诸如cross_val_score和GridSearchCV之类的其他功能可以完美地工作。现在,我正在尝试将我的代码调整为一种具有预定义类以容纳NN的项目的格式。当尝试使用KerasClassifier包装器类型分配此新类或该类的属性时,.fit()的返回将代替engi​​ne.sequential.Sequential类型,这意味着其他功能将无法使用。

我希望.fit()函数返回KerasClassifier类型的项目。

下面的代码将传递经过预处理的训练数据。

class Module4_Model:

    def __init__(self):
        self.my_model = None

    def init_classifier(self):
        self.my_model = KerasClassifier(build_fn = self.build_classifier,
                             optimizer = 'adam',
                             n_units = 7,
                             batch_size = 32,
                             epochs = 100)
        return self.my_model

    def build_classifier(self, optimizer, n_units):
        self.my_model = Sequential()
        self.my_model.add(Dense(units = n_units, kernel_initializer = 'uniform', activation = 'relu', input_dim = 15))
        self.my_model.add(Dense(units = n_units, kernel_initializer = 'uniform', activation = 'relu'))
        self.my_model.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid'))
        self.my_model.compile(optimizer = optimizer, loss = 'binary_crossentropy', metrics = ['accuracy'])
        return self.my_model

    def train_model(self, X_train, y_train):
        history = self.my_model.fit(X_train, y_train, validation_split = 0.1)
        print(type(self.my_model))
        return history

my_model = Module4_Model()

my_model.init_classifier()

history = my_model.train_model(x_train_processed, y_train_processed)

将相同的代码移到类之外可以正常工作。

1 个答案:

答案 0 :(得分:0)

问题是您在self.my_modelinit_classifier中使用了相同的变量(build_classifier),这根本没有必要。创建KerasClassifier实例时,它接收到self.build_classifier,每次创建一个新的分类器实例时(在KerasClassifier内部)都会调用该self.my_model,然后它将覆盖{{1} }。

一个简单的解决方案是这样做:

def build_classifier(self, optimizer, n_units):
        model = Sequential()
        model.add(Dense(units = n_units, kernel_initializer = 'uniform', activation = 'relu', input_dim = 15))
        model.add(Dense(units = n_units, kernel_initializer = 'uniform', activation = 'relu'))
        model.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid'))
        model.compile(optimizer = optimizer, loss = 'binary_crossentropy', metrics = ['accuracy'])
        return model

请不要将相同的变量用于两个目的,这应该没问题。