#tensorflow #keras #neural-network #loss-function #semantic-segmentation
#tensorflow #keras #нейронная сеть #функция потери #семантическая сегментация
Вопрос:
Я работаю над проектом семантической сегментации, в котором мне приходится работать с многоклассовыми данными, которые сильно несбалансированы. Я искал его оптимизацию во время обучения с использованием model.fit
параметра и в нем использовать class_weights
or sample_weights
.
Я могу реализовать следующее, используя словарь class_weight как
{ 0:1, 1:10,2:15 }
Я также видел метод обновления весов в loss function
Но в какой момент эти веса обновляются?
- Если используются class_weights, где это будет наказываться? У меня уже есть a
kernel_regularizer
для каждого слоя, поэтому, если мои классы должны быть оштрафованы на основе моих весов классов, будет ли это наказывать вывод каждого слоя y = Wx b или только на последнем уровне? - То же самое, если я использую функцию взвешенных потерь, будет ли она оштрафована только на последнем уровне перед вычислением потерь или на каждом уровне, а затем вычисляется окончательная потеря?
Любое объяснение по этому поводу было бы очень полезно.
Ответ №1:
class_weights
Вы упомянули в своем словаре, чтобы учесть ваши несбалансированные данные. Они никогда не изменятся, они существуют только для увеличения штрафа за неправильно классифицированные экземпляры классов меньшинства (таким образом, ваша сеть уделяет им больше внимания, а возвращаемые градиенты обрабатывают один экземпляр ‘Class2’ так, как если бы он был в 15 раз важнее, чем один экземпляр ‘Class0’).
Упомянутая kernel_regularizer
вами функция находится в вашей функции потерь и наказывает большие нормы веса для весовых матриц по всей сети (если вы используете kernel_regularizer = tf.keras.regularizers.l1(0.01)
в Dense
слое, это влияет только на этот слой). Так что это другой вес, который не имеет ничего общего с классами, только с весами внутри вашей сети. Ваша возможная потеря будет чем-то вроде loss = Cross_entropy a * norm(Weight_matrix), и таким образом, на сеть будет возложена дополнительная задача по минимизации потери классификации (перекрестной энтропии), в то время как нормы веса остаются низкими.
Комментарии:
1. Спасибо. Просто небольшое уточнение, поэтому оба будут работать только с выводом весов классификации сети и не будут вносить никаких изменений в мои веса каждого уровня? Это правильно?
2. kernel_regularizer влияет на веса слоя, для которого вы его вызвали, поэтому он может повлиять на веса первого слоя, например. (или вы можете использовать регуляризатор ядра для каждого уровня) Веса классов не имеют ничего общего с вашими сетевыми весами напрямую. Они будут влиять на веса сети только косвенно, по мере продолжения обучения, так что ваши измененные веса учитывают тот факт, что некоторые классы важнее других. Итак, еще раз, веса классов не являются весами сети. Они влияют на все веса сети косвенным образом (посредством обучения).
3. Спасибо, это именно то, что меня смутило.