#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, но выпадение на видимом слое не является необычной практикой, хотя я не уверен в мотивации здесь. Выпадение на видимом слое означает, что вы игнорируете процент входных данных. По сути, вы выполняете выборку.