Я использую 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, не создавайте нейронную сеть с нуля или не используйте другую уже существующую.
Densenet121
иDensenet169
, начните с весов и настройте их. 2. Добавьте аугментацию во время тренировки. - person Mohsin hasan   schedule 16.08.2019