CNN, как оптимизировать гиперпараметры, чтобы предотвратить переоснащение - PullRequest
1 голос
/ 06 марта 2020

В настоящее время я разрабатываю CNN для мультиклассификации (3 класса) с использованием Tensorflow Keras. Я использовал sklearn, чтобы разделить мои данные на поезд 9: 1 / подтверждение (1899 данных обучения, 212 данных проверки).

enter image description here

Моя модель CNN начинает медленно расти после 17 эпох. Это означает, что модель CNN начинает переоснащаться? Любое предложение уменьшить потерю проверки, так как я использовал отсев и нормализацию партии в модели CNN. Я также использовал EarlyStopping для исследования моей модели CNN, но после некоторой корректировки моя модель CNN все еще сталкивается с этой проблемой.

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)

model = Sequential()

# filters, kernel size, input size
model.add(Conv2D(256, (3, 3), input_shape=X.shape[1:], padding='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=2))
model.add(Dropout(0.2))

model.add(Conv2D(256, (3, 3), padding='same'))
model.add(Dropout(0.2))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=2))

model.add(Conv2D(256, (3, 3), padding='same'))
model.add(Dropout(0.25))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=2))

model.add(Conv2D(256, (3, 3), padding='same'))
model.add(Dropout(0.25))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=2))

model.add(Flatten())
model.add(Dense(256))
model.add(BatchNormalization())
model.add(Activation('relu'))

model.add(Dropout(0.8))
model.add(Dense(3))
model.add(Activation('softmax'))

tensorboard = TensorBoard(log_dir="CNN_Model_Rebuilt/logs/{}".format(NAME))

augmented_checkpoint = ModelCheckpoint(
                'CNN_Model_Rebuilt/best model/normalization-best.h5',
                monitor='val_loss', verbose=0,
                save_best_only=True, mode='auto')

es = EarlyStopping(monitor='val_loss',
                   min_delta=0,
                   patience=20,
                   verbose=0, mode='auto')

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

model.fit(X_train, to_categorical(y_train), batch_size=32, epochs=100,
                      validation_data=(X_test, to_categorical(y_test)), 
                      callbacks=[augmented_checkpoint, tensorboard, es], verbose=2)

Любые советы / предложения будут благодарны. Спасибо.

1 Ответ

0 голосов
/ 18 марта 2020

Чтобы уменьшить переоснащение, вы можете попытаться увеличить количество входных данных, затем увеличить это (перевернуть, повернуть, масштабировать и т. Д. c.), Это может улучшить способность к обобщению .

Что касается модели, некоторые идеи, которые вы можете попробовать, это увеличить количество слоев , увеличить количество единиц , увеличить выпадение значение , используйте другую активацию , добавьте новый слой , который не используется, и некоторые другие встроенные и настроенные регуляризация методы.

Вы всегда можете поэкспериментировать с этими параметрами и слоями, чтобы получить более точную модель или , иногда немного хуже . Идея заключается в настройке гиперпараметров, смешивании и сопоставлении.

Вы также можете прочитать о Расширении библиотеки TensorFlow, называемом Tensor Flow Model Optimization Toolkit , в этой ссылке .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...