Объект ‘Sequential’ не имеет атрибута ‘loss’ — Когда я использовал GridSearchCV для настройки моей модели Keras

#python #tensorflow #keras

#python #tensorflow #keras

Вопрос:

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

Однако, когда я вызываю fit функцию, она говорит:

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

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

Вот мой код:

 из tensorflow.keras.models импортируйте Sequential, модель 
 из tensorflow.keras.слои импортируют входные данные, плотность, активацию, отсев, пакетную нормализацию 
 из tensorflow.keras.datasets импортируйте mnist 
 из tensorflow.keras.wrappers.scikit_learn импортирую KerasClassifier 
 из sklearn.model_selection импортируйте GridSearchCV

 ...
 ...
 ...


 определение get_model(dropout_rate = 0.2, hidden_units = 512):
 model = Sequential()
 model.add(Выпадающий(dropout_rate, input_shape=(28 * 28,)))
 model.add(Плотный (hidden_units, активация ='relu'))
 model.add(BatchNormalization())
 model.add(Выпадающий (dropout_rate))
 model.add(Плотный (hidden_units, активация ='relu'))
 model.add(BatchNormalization())
 model.add(Выпадающий (dropout_rate))
 model.add(Плотный (hidden_units, активация ='relu'))
 model.add(BatchNormalization())
 model.add(Выпадающий (dropout_rate))
 model.add(Плотный (10, активация = 'softmax'))
 возвращаемая модель

 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(модель, para_dict, cv = 5, оценка = 'точность')
 clf.fit(x_train, y_train)

Спасибо!

Комментарии:

1. В вашей build_model вы не добавили функцию потери. Сделайте это следующим образом: model.compile(optimizer = optimizer, loss = 'binary_crossentropy', metrics = ['accuracy'])

Ответ №1:

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
  

Комментарии:

1. Спасибо! Но я сталкиваюсь с новой проблемой, когда я вызываю fit функцию, моя модель может завершить обучение, но не выполнить оценку. Новое исключение ValueError: Classification metrics can't handle a mix of multilabel-indicator and multiclass targets . Мои y_train векторы onehot, сгенерированные to_categorical функцией, и мои потери categorical_crossentropy , метрика — точность.

2. У вас проблема с классификацией по нескольким меткам? @TomLeung Потому что использование softmax для классификации с несколькими метками нежелательно. Вы можете использовать все функции потери keras в качестве показателей. Нравится metrics = ['categorical_crossentropy'] . Это всего лишь предложение.

3. Я имею дело с проблемой классификации MNIST (10 классов), мой последний слой использует softmax активацию, и моя потеря categorical_crossentropy . Но, наконец, мне удается запустить fit функцию, преобразовав мои y_train из одноточечных векторов в метки с одним целым числом. Я не понимаю, почему sklearn не принимают векторы onehot в качестве меток, а также разницу между линейной активацией с метрикой categorical_crossentropy и активацией softmax с метрикой accuracy. Не могли бы вы объяснить мне подробно?

4. @NihalSangeeth Звучит ли как лучшая практика использовать drop out на самом первом уровне? Я имею в виду до первого плотного слоя? Почему не после этого?

5. Я просто отвечал на вопрос OP, но выпадение на видимом слое не является необычной практикой, хотя я не уверен в мотивации здесь. Выпадение на видимом слое означает, что вы игнорируете процент входных данных. По сути, вы выполняете выборку.