переоснащение эля xnet - python - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть эль xnet нейронная сеть, которую я написал с нуля с использованием тензорного потока, и я использовал 6000 изображений в качестве train_data. но во время обучения точность проверки не меняется и больше, чем точность обучения, я полагаю, что это слишком много. Кроме того, потеря проверки увеличивается. Можно ли решить проблему переобучения 1000 данных для экономии времени? Как я могу предотвратить переоснащение? Я прикрепил свой код эля xnet ниже. Спасибо

def CreateModel():
model = Sequential()

# 1st Convolutional Layer
model.add(Conv2D(filters=96, input_shape=(227,227,3), kernel_size=(11,11), strides=(4,4), padding='valid'))
model.add(Activation('relu'))
# Max Pooling
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))

# 2nd Convolutional Layer
model.add(Conv2D(filters=256, kernel_size=(11,11), strides=(1,1), padding='valid'))
model.add(Activation('relu'))
# Max Pooling
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))

# 3rd Convolutional Layer
model.add(Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), padding='valid'))
model.add(Activation('relu'))

# 4th Convolutional Layer
model.add(Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), padding='valid'))
model.add(Activation('relu'))

# 5th Convolutional Layer
model.add(Conv2D(filters=256, kernel_size=(3,3), strides=(1,1), padding='valid'))
model.add(Activation('relu'))
# Max Pooling
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))

# Passing it to a Fully Connected layer
model.add(Flatten())
# 1st Fully Connected Layer
model.add(Dense(4096, input_shape=(224*224*3,)))
model.add(Activation('relu'))
# Add Dropout to prevent overfitting
model.add(Dropout(0.5))

# 2nd Fully Connected Layer
model.add(Dense(4096))
model.add(Activation('relu'))
# Add Dropout
model.add(Dropout(0.5))

# 3rd Fully Connected Layer
model.add(Dense(1000))
model.add(Activation('relu'))
# Add Dropout
model.add(Dropout(0.5))

# Output Layer
model.add(Dense(2))
model.add(Activation('softmax'))

model.summary()
return model

alexNet_model = CreateModel()
alexNet_model.compile(loss='sparse_categorical_crossentropy' , optimizer='adam', metrics=["accuracy"])
batch_size = 4
epochs = 5
history = alexNet_model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1,
                   validation_data=(x_validation, y_validation))

1 Ответ

0 голосов
/ 08 апреля 2020

Для смягчения переоснащения. Вы можете попробовать реализовать следующие шаги

1. Shuffle Data, используя shuffle=True в alexNet_model.fit. Код показан ниже:

history = alexNet_model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1,
                   validation_data=(x_validation, y_validation), shuffle = True)

2.Использование Early Stopping. Код показан ниже

callback = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=15)

3.Используйте регуляризацию. Код для регуляризации показан ниже (Вы также можете попробовать Регуляризацию l1 или Регуляризацию l1_l2):

from tensorflow.keras.regularizers import l2

Regularizer = l2(0.001)

alexNet_model.add(Conv2D(96,11, 11, input_shape = (227,227,3),strides=(4,4), padding='valid', activation='relu', data_format='channels_last', 
                    activity_regularizer=Regularizer, kernel_regularizer=Regularizer))

alexNet_model.add(Dense(units = 2, activation = 'sigmoid', 
                    activity_regularizer=Regularizer, kernel_regularizer=Regularizer))

4.Вы можете попробовать использовать BatchNormalization.

5. Выполнить увеличение данных изображения используя ImageDataGenerator. Для получения дополнительной информации см. эту ссылку .

6.Если пиксели не Normalized, разделение значений пикселей с 255 также помогает

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