Добавление исключения в MobileNet с помощью TensorFlow 2

Я использую MobileNet и TensorFlow 2, чтобы различать 4 довольно похожих игрушки. У меня есть ровно 750 изображений для каждой игрушки и одна этикетка, содержащая 750 «негативных» изображений, без каких-либо игрушек.

Раньше я использовал MobileNet для этого с достаточной степенью успеха, но что-то в этом случае вызывает много переобучений (~ 30-40% расхождения между точностью обучения / проверки). Модель очень быстро обучается с точностью обучения около 99,8% за 3 периода, но точность проверки остается на уровне 75%. Набор данных проверки - это случайный набор из 20% входных изображений. Если посмотреть на точность модели, можно заметить сильную предвзятость в пользу одной из игрушек, поскольку многие другие игрушки ошибочно идентифицированы как эта игрушка.

Я перепробовал практически все, чтобы с этим бороться:

Я добавил Dropout после слоя Conv2D, который добавлен в верхнюю часть MobileNet, и попробовал различные коэффициенты отсева от 0,2 до 0,9.

model = tf.keras.Sequential([
  base_model,
  tf.keras.layers.Conv2D(32, 3, activation='relu'),
  tf.keras.layers.Dropout(0.5),
  tf.keras.layers.GlobalAveragePooling2D(),
  tf.keras.layers.Dense(label_count, activation='softmax')
])

Я добавил дополнительный слой Dropout перед слоем Conv2D, который, похоже, немного улучшил ситуацию:

model = tf.keras.Sequential([
  base_model,
  tf.keras.layers.Dropout(0.5),
  tf.keras.layers.Conv2D(32, 3, activation='relu'),
  tf.keras.layers.Dropout(0.5),
  tf.keras.layers.GlobalAveragePooling2D(),
  tf.keras.layers.Dense(label_count, activation='softmax')
])

Я также добавил больше тестовых данных, пробуя смеси фотографий игрушек в различных условиях освещения и фонов и сгенерировал изображения игрушек, наложенных на случайный фон. Ни один из них не оказывает значительного влияния.

Должен ли я добавлять выпадение к модели MobileNet, а не только к слоям, которые я добавляю после нее? Я наткнулся на этот код на github, который делает это, но я понятия не имею, на самом деле хорошая идея или нет - или как этого добиться с помощью TensorFlow 2.

Это разумно или возможно?

В качестве альтернативы я могу придумать только следующие идеи:

  • Захватите больше изображений, чтобы усложнить обучение - но я бы подумал, что 750 для каждого элемента должно быть достаточно, чтобы сделать довольно хорошую работу.
  • Не используйте MobileNet, не создавайте нейронную сеть с нуля или не используйте другую уже существующую.

person eAi    schedule 16.08.2019    source источник
comment
1. Используйте другие архитектуры; Я бы порекомендовал Densenet121 и Densenet169, начните с весов и настройте их. 2. Добавьте аугментацию во время тренировки.   -  person Mohsin hasan    schedule 16.08.2019


Ответы (1)


Поскольку модель переоборудована, вы можете

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

    history = cnn_model.fit(x = X_train_reshaped, y = y_train, batch_size = 512, epochs = epochs, callbacks=[callback], verbose = 1, validation_data = (X_test_reshaped, y_test), validation_steps = 10, steps_per_epoch=steps_per_epoch, shuffle = True)

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

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

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

    from tensorflow.keras.regularizers import l2

    Regularizer = l2(0.001)

    cnn_model.add(Conv2D(64,3, 3, input_shape = (28,28,1), activation='relu', data_format='channels_last', activity_regularizer=Regularizer, kernel_regularizer=Regularizer))

    cnn_model.add(Dense(units = 10, activation = 'sigmoid', activity_regularizer=Regularizer, kernel_regularizer=Regularizer))

  2. Попробуйте заменить GlobalAveragePooling2D на MaxPool2D

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

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

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

  6. Наконец, если изменений по-прежнему нет, вы можете попробовать другие Pre-Trained Models, например ResNet, Vgg Net, DenseNet (как упоминал Мохсин в комментариях)

person Tensorflow Support    schedule 04.12.2019