KerasClassifier внутри нового класса работает некорректно - PullRequest
1 голос
/ 26 мая 2020
• 1000 Теперь я пытаюсь приспособить свой код к формату, который мне предоставили для проекта, в котором есть предопределенный класс для хранения NN. При попытке назначить либо этот новый класс, либо свойство класса с типом оболочки KerasClassifier, возвращается из .fit () вместо типа engine.sequential.Sequential, что означает, что дальнейшие функции не будут работать.

I ожидает, что функция .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 голосов
/ 26 мая 2020

Проблема в том, что вы используете одну и ту же переменную (self.my_model) как внутри init_classifier, так и build_classifier, что совсем не обязательно. Когда создается экземпляр KerasClassifier, он получает self.build_classifier, который вызывается каждый раз при создании нового экземпляра классификатора (внутри KerasClassifier), а затем перезаписывает значение self.my_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

Просто не используйте одну и ту же переменную для двух целей, и все должно быть хорошо.

...