Каковы критерии веса Deeplab моего пользовательского набора данных?
Я тренирую Deeplab v3, делая пользовательский набор данных в трех классах, включая фон
Тогда, Мой класс - фон, панда, бутылка и есть 1949 картин.
и я использую модель moblienetv2
и segmentation_dataset.py был изменен следующим образом.
_MYDATA_INFORMATION = DatasetDescriptor(
splits_to_sizes={
'train': 975, # num of samples in images/training
'trainval': 1949,
'val': 974, # num of samples in images/validation
},
num_classes=3,
ignore_label=0,
)
Файл train.py был изменен следующим образом.
flags.DEFINE_boolean('initialize_last_layer', False,
'Initialize the last layer.')
flags.DEFINE_boolean('last_layers_contain_logits_only', True,
'Only consider logits as last layers or not.')
train_utils.py не был изменен.
not_ignore_mask = tf.to_float(tf.not_equal(scaled_labels, ignore_label)) * loss_weight
Я получаю некоторые результаты, но не идеальные.
Например, цвета маски панды и бутылки одинаковы или не различимы
Результат, который я хочу, это панда красного и бутылка зеленого
Итак, я решил, что возникла проблема с весом.
На основании вопросов других людей, train_utils.py был настроен следующим образом
irgore_weight = 0
label0_weight =1
label1_weight = 10
label2_weight = 15
not_ignore_mask =
tf.to_float(tf.equal(scaled_labels, 0)) * label0_weight +
tf.to_float(tf.equal(scaled_labels, 1)) * label1_weight +
tf.to_float(tf.equal(scaled_labels, 2)) * label2_weight +
tf.to_float(tf.equal(scaled_labels, ignore_label)) * irgore_weight
tf.losses.softmax_cross_entropy(
one_hot_labels,
tf.reshape(logits, shape=[-1, num_classes]),
weights=not_ignore_mask,
scope=loss_scope)
У меня есть вопрос здесь.
Каковы критерии для веса?
Мой набор данных состоит из следующего.
введите описание изображения здесь
Он генерируется автоматически, поэтому я не знаю точно, какой из них больше, но это примерно столько же.
И еще одна вещь, я использую цветную карту Паскаля.
Это первый черный фон, а второй красный третий зеленый.
Я хочу обозначить панд красными, а бутылки - зелеными. Что я должен делать?
1 ответ
Я думаю, что вы, возможно, перепутали свое определение лейбла. Может быть, я могу помочь вам с этим. Пожалуйста, проверьте еще раз ваш segmentation_dataset.py. Здесь вы определяете "0" как игнорируемую метку. Это означает, что все пиксели, которые помечены как "0", исключаются из процесса обучения (более конкретно, исключаются при вычислении функции потерь и, таким образом, не влияют на обновление весов). В свете этой ситуации крайне важно не "игнорировать" фоновый класс, так как это также класс, который вы хотите правильно предсказать. В train_utils.py вы назначаете весовой коэффициент игнорируемому классу, который не будет иметь никакого эффекта -> Убедитесь, что вы не смешиваете три своих учебных класса [background, panada, bottle] с тегом "ignored".
В вашем случае num_classes= 3 должно быть правильным, так как оно указывает количество меток для прогнозирования (модель автоматически предполагает, что эти метки равны 0, 1 и 2. Если вы хотите игнорировать определенные метки, вы должны аннотировать их четвертым классом меток (просто выберите для этого число>2), а затем присвойте этот ярлык ignored_label. Если у вас нет пикселей, которые нужно игнорировать, установите значение ignored_label= 255, и это не повлияет на ваше обучение;)