新类中的KerasClassifier功能不正确

新类中的KerasClassifier功能不正确,keras,Keras,我正在使用KerasClassifier创建NN,通常在使用.fit()之后,对象仍将保留wrappers.scikit_learn.KerasClassifier的类型,然后cross_val_score和GridSearchCV等其他函数将完美工作。我现在正试图将我的代码调整为一种格式,这种格式是为一个项目提供的,该项目有一个预定义的类来保存NN。当尝试分配此新类或具有KerasClassifier包装类型的类的属性时,从.fit()返回的类型不是engine.sequential.sequ

我正在使用KerasClassifier创建NN,通常在使用.fit()之后,对象仍将保留wrappers.scikit_learn.KerasClassifier的类型,然后cross_val_score和GridSearchCV等其他函数将完美工作。我现在正试图将我的代码调整为一种格式,这种格式是为一个项目提供的,该项目有一个预定义的类来保存NN。当尝试分配此新类或具有KerasClassifier包装类型的类的属性时,从.fit()返回的类型不是engine.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)

移到类外的同一代码按预期工作。

问题是您在
初始化分类器
构建分类器
内使用了相同的变量(
self.my_model
),这根本不需要。创建
KerasClassifier
实例时,它会收到
self.build\u分类器
,每次创建新分类器实例时都会调用它(在
KerasClassifier
内部),然后它会覆盖
self.my\u model
的值

一个简单的解决方案是:

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

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

问题是,您在
初始分类器
构建分类器
中使用了相同的变量(
self.my\u model
),这根本不需要。创建
KerasClassifier
实例时,它会收到
self.build\u分类器
,每次创建新分类器实例时都会调用它(在
KerasClassifier
内部),然后它会覆盖
self.my\u model
的值

一个简单的解决方案是:

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

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

因此,您希望让您的
train\u model
返回您的
self.my\u model
?为什么要将self.my\u model用于两件事?在build_分类器中不需要使用类变量,这可能是problem@MatiasValdenegro-目的是使用
self.my_model
固定KerasClassifier。不幸的是,我得到了一个需要遵循的模板,它要求KerasClassifier被放置在self的这个属性中。令人烦恼的是,我有一个模型,它在不使用类的情况下工作,但与要使用的模板不太配合!模板的思想是,用于标准化和编码数据的参数也可以保存在
Module4_Model
类中,为了简单起见,我在这里删除了这些部分。@Yoskutik-
train_Model
用于使用
fit
函数训练KerasClassifier。在调用
train\u model
之前,调用
my\u model。my\u model
属于KerasClassifier类型,但是,
fit
函数返回的对象类型为Sequential。正是这一部分让我困惑。所以你想让你的
train\u模型
返回你的
self.my\u模型
?你为什么用self.my\u模型做两件事?在build_分类器中不需要使用类变量,这可能是problem@MatiasValdenegro-目的是使用
self.my_model
固定KerasClassifier。不幸的是,我得到了一个需要遵循的模板,它要求KerasClassifier被放置在self的这个属性中。令人烦恼的是,我有一个模型,它在不使用类的情况下工作,但与要使用的模板不太配合!模板的思想是,用于标准化和编码数据的参数也可以保存在
Module4_Model
类中,为了简单起见,我在这里删除了这些部分。@Yoskutik-
train_Model
用于使用
fit
函数训练KerasClassifier。在调用
train\u model
之前,调用
my\u model。my\u model
属于KerasClassifier类型,但是,
fit
函数返回的对象类型为Sequential。正是这一部分让我困惑。非常感谢您的快速回复。这是非常有意义的,而且非常有效。我为我的无知道歉在我的第一次回答中,我不明白你在说什么。现在这个很好用!非常感谢您的快速回复。这是非常有意义的,而且非常有效。我为我的无知道歉在我的第一次回答中,我不明白你在说什么。现在这个很好用!