«Последовательный» объект не имеет атрибута «потеря» - когда я использовал GridSearchCV для настройки моей модели Keras - PullRequest
2 голосов
/ 25 марта 2019

Я использую tensorflow и keras для построения простой модели классификации MNIST, и я хочу настроить свою модель, поэтому я выбираю sklearn.model_selection.GridSearchCV.

Однако, когда я вызываю *Функция 1006 *, он сказал:

AttributeError: 'Sequential' object has no attribute 'loss'

Я сравнил свой код с чужим, но все еще не могу понять, почему.Разница лишь в том, что я использую tensorflow.keras вместо keras.

Вот мой код:


    from tensorflow.keras.models import Sequential, Model
    from tensorflow.keras.layers import Input, Dense, Activation, Dropout, BatchNormalization
    from tensorflow.keras.datasets import mnist
    from tensorflow.keras.wrappers.scikit_learn import KerasClassifier
    from sklearn.model_selection import GridSearchCV

    ...
    ...
    ...


    def get_model(dropout_rate=0.2, hidden_units=512):
        model = Sequential()
        model.add(Dropout(dropout_rate, input_shape=(28*28,)))
        model.add(Dense(hidden_units, activation='relu'))
        model.add(BatchNormalization())
        model.add(Dropout(dropout_rate))
        model.add(Dense(hidden_units, activation='relu'))
        model.add(BatchNormalization())
        model.add(Dropout(dropout_rate))
        model.add(Dense(hidden_units, activation='relu'))
        model.add(BatchNormalization())
        model.add(Dropout(dropout_rate))
        model.add(Dense(10, activation='softmax'))
        return model

    model = KerasClassifier(build_fn=get_model, batch_size=128, epochs=10)
    para_dict = {'dropout_rate':[0.2,0.5,0.8], 'hidden_units':[128,256,512,1024]}
    clf = GridSearchCV(model, para_dict, cv=5, scoring='accuracy')
    clf.fit(x_train, y_train)

Спасибо!

1 Ответ

1 голос
/ 25 марта 2019

Приведенная выше функция build_model не настраивает ваш model для обучения. Вы добавили loss и другие параметры.

Вы можете использовать последовательный метод keras compile. https://keras.io/models/sequential/

Итак, ваша функция build_model должна быть:

loss = 'binary_crossentropy' #https://keras.io/optimizers
optimizer = 'adam'           #https://keras.io/losses
metrics = ['accuracy']
def get_model(dropout_rate=0.2, hidden_units=512):
    model = Sequential()
    model.add(Dropout(dropout_rate, input_shape=(28*28,)))
    model.add(Dense(hidden_units, activation='relu'))
    model.add(BatchNormalization())
    model.add(Dropout(dropout_rate))
    model.add(Dense(hidden_units, activation='relu'))
    model.add(BatchNormalization())
    model.add(Dropout(dropout_rate))
    model.add(Dense(hidden_units, activation='relu'))
    model.add(BatchNormalization())
    model.add(Dropout(dropout_rate))
    model.add(Dense(10, activation='softmax'))
    model.compile(optimizer = optimizer, loss = loss, metrics = metrics)
    return model
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...