1

Я пытаюсь обучить fcn32. Я тренирую модель voc-fcn32s для своих собственных данных с неуравновешенным номером класса. Это кривая обучения для 18 000 итераций: enter image description hereМодель FCN32 не сходится, и потери теряются после некоторых точек. Зачем?

Как вы можете видеть, тренировка в некоторых точках уменьшается, а затем она колеблется. Я прочитал некоторые онлайн-рекомендации, которые они предлагают уменьшить скорость обучения или изменить значение смещения в слоях свертки для наполнителей. Итак, что я сделал, что я изменил train_val.prototxt следующим образом для этих двух слоев:

.... 
layer { 
     name: "score_fr" 
     type: "Convolution" 
     bottom: "fc7" 
     top: "score_fr" 
     param { 
     lr_mult: 1 
     decay_mult: 1 
     } 
     param { 
     lr_mult: 2 
     decay_mult: 0 
     } 
     convolution_param { 
     num_output: 5 # the number of classes 
     pad: 0 
     kernel_size: 1 
     weight_filler { 
      type: "xavier" 
     } 
     bias_filler { 
      type: "constant" 
      value: 0.5 #+ 
     } 
     } 
    } 
    layer { 
     name: "upscore" 
     type: "Deconvolution" 
     bottom: "score_fr" 
     top: "upscore" 
     param { 
     lr_mult: 0 
     } 
     convolution_param { 
     num_output: 5 # the number of classes 
     bias_term: true #false 
     kernel_size: 64 
     stride: 32 
     group: 5 #2 
     weight_filler: { 
      type: "bilinear" 
      value:0.5 #+ 
     } 
     } 
    } 
.... 

И это тенденция модели enter image description here

Кажется, не так много, что изменилось в поведении модель.

1) Правильно ли вы добавляете эти значения в weight_filler?

2) Должен ли я изменить учебную политику в решателе от fixed до step, уменьшая в 10 раз каждый раз? Помог ли он решить эту проблему?

Я беспокоюсь, что делаю неправильные вещи, и моя модель не может сходиться. Есть ли у кого-нибудь какие-либо предложения по этому поводу? Какие важные вещи я должен учитывать при модели обучения? Какие изменения я могу сделать на solver и train_val, чтобы модель была конвергентной?

Я очень ценю вашу помощь.

Подробнее после добавления BatchNorm слой

Благодаря @Shai и предложившего @ Джонатан добавить batchNorm слоев. я добавил Batch Normalization Layers перед тем reLU слоев, этот слой один пример:

layer { 
    name: "conv1_1" 
    type: "Convolution" 
    bottom: "data" 
    top: "conv1_1" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 64 
    pad: 100 
    kernel_size: 3 
    stride: 1 
    } 
} 
layer { 
    name: "bn1_1" 
    type: "BatchNorm" 
    bottom: "conv1_1" 
    top: "bn1_1" 
    batch_norm_param { 
    use_global_stats: false 
    } 
    param { 
    lr_mult: 0 
    } 
    include { 
    phase: TRAIN 
    } 
} 
layer { 
    name: "bn1_1" 
    type: "BatchNorm" 
    bottom: "conv1_1" 
    top: "bn1_1" 
    batch_norm_param { 
    use_global_stats: true 
    } 
    param { 
    lr_mult: 0 
    } 
    include { 
    phase: TEST 
    } 
} 
layer { 
    name: "scale1_1" 
    type: "Scale" 
    bottom: "bn1_1" 
    top: "bn1_1" 
    scale_param { 
    bias_term: true 
    } 
} 
layer { 
    name: "relu1_1" 
    type: "ReLU" 
    bottom: "bn1_1" 
    top: "bn1_1" 
} 
layer { 
    name: "conv1_2" 
    type: "Convolution" 
    bottom: "bn1_1" 
    top: "conv1_2" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 64 
    pad: 1 
    kernel_size: 3 
    stride: 1 
    } 
} 

Насколько я знал из документации, могу только добавить один параметр в пакетном нормализации вместо трех, так как у меня есть изображения одного канала. Это мое понимание верно? следующим образом:

param { 
    lr_mult: 0 
    } 

Следует ли добавить дополнительные параметры для масштабирования слоя, как упоминается в документации? В чем смысл этих параметров в слое Scale? как:

layer { bottom: 'layerx-bn' top: 'layerx-bn' name: 'layerx-bn-scale' type: 'Scale', 
    scale_param { 
    bias_term: true 
    axis: 1  # scale separately for each channel 
    num_axes: 1 # ... but not spatially (default) 
    filler { type: 'constant' value: 1 }   # initialize scaling to 1 
    bias_filler { type: 'constant' value: 0.001 } # initialize bias 
}} 

и это the drawing сети. Я не уверен, насколько я ошибаюсь/прав. Я добавил правильно? Другой вопрос: debug_info. В чем смысл этих строк файла журнала после активации debug_info? Что означает diff и data? И почему значения равны 0? Моя сеть работает правильно?

I:17:49.498327 15230 solver.cpp:228] Iteration 50, loss = 105465 
    I:17:49.498337 15230 solver.cpp:244]  Train net output #0: accuracy = 0.643982 
    I:17:49.498349 15230 solver.cpp:244]  Train net output #1: loss = 105446 (* 1 = 105446 loss) 
    I:17:49.498359 15230 sgd_solver.cpp:106] Iteration 50, lr = 1e-11 
    I:19:12.680325 15230 net.cpp:608]  [Forward] Layer data, top blob data data: 34.8386 
    I:19:12.680615 15230 net.cpp:608]  [Forward] Layer data_data_0_split, top blob data_data_0_split_0 data: 34.8386 
    I:19:12.680670 15230 net.cpp:608]  [Forward] Layer data_data_0_split, top blob data_data_0_split_1 data: 34.8386 
    I:19:12.680778 15230 net.cpp:608]  [Forward] Layer label, top blob label data: 0 
    I:19:12.680829 15230 net.cpp:608]  [Forward] Layer label_label_0_split, top blob label_label_0_split_0 data: 0 
    I:19:12.680896 15230 net.cpp:608]  [Forward] Layer label_label_0_split, top blob label_label_0_split_1 data: 0 
    I:19:12.688591 15230 net.cpp:608]  [Forward] Layer conv1_1, top blob conv1_1 data: 0 
    I:19:12.688695 15230 net.cpp:620]  [Forward] Layer conv1_1, param blob 0 data: 0 
    I:19:12.688742 15230 net.cpp:620]  [Forward] Layer conv1_1, param blob 1 data: 0 
    I:19:12.721791 15230 net.cpp:608]  [Forward] Layer bn1_1, top blob bn1_1 data: 0 
    I:19:12.721853 15230 net.cpp:620]  [Forward] Layer bn1_1, param blob 0 data: 0 
    I:19:12.721890 15230 net.cpp:620]  [Forward] Layer bn1_1, param blob 1 data: 0 
    I:19:12.721901 15230 net.cpp:620]  [Forward] Layer bn1_1, param blob 2 data: 96.1127  
    I:19:12.996196 15230 net.cpp:620]  [Forward] Layer scale4_1, param blob 0 data: 1 
    I:19:12.996237 15230 net.cpp:620]  [Forward] Layer scale4_1, param blob 1 data: 0 
    I:19:12.996939 15230 net.cpp:608]  [Forward] Layer relu4_1, top blob bn4_1 data: 0 
    I:19:13.012020 15230 net.cpp:608]  [Forward] Layer conv4_2, top blob conv4_2 data: 0 
    I:19:13.012403 15230 net.cpp:620]  [Forward] Layer conv4_2, param blob 0 data: 0 
    I:19:13.012446 15230 net.cpp:620]  [Forward] Layer conv4_2, param blob 1 data: 0 
    I:19:13.015959 15230 net.cpp:608]  [Forward] Layer bn4_2, top blob bn4_2 data: 0 
    I:19:13.016005 15230 net.cpp:620]  [Forward] Layer bn4_2, param blob 0 data: 0 
    I:19:13.016046 15230 net.cpp:620]  [Forward] Layer bn4_2, param blob 1 data: 0 
    I:19:13.016054 15230 net.cpp:620]  [Forward] Layer bn4_2, param blob 2 data: 96.1127 
    I:19:13.017211 15230 net.cpp:608]  [Forward] Layer scale4_2, top blob bn4_2 data: 0 
    I:19:13.017251 15230 net.cpp:620]  [Forward] Layer scale4_2, param blob 0 data: 1 
    I:19:13.017292 15230 net.cpp:620]  [Forward] Layer scale4_2, param blob 1 data: 0 
    I:19:13.017980 15230 net.cpp:608]  [Forward] Layer relu4_2, top blob bn4_2 data: 0 
    I:19:13.032080 15230 net.cpp:608]  [Forward] Layer conv4_3, top blob conv4_3 data: 0 
    I:19:13.032452 15230 net.cpp:620]  [Forward] Layer conv4_3, param blob 0 data: 0 
    I:19:13.032493 15230 net.cpp:620]  [Forward] Layer conv4_3, param blob 1 data: 0 
    I:19:13.036018 15230 net.cpp:608]  [Forward] Layer bn4_3, top blob bn4_3 data: 0 
    I:19:13.036064 15230 net.cpp:620]  [Forward] Layer bn4_3, param blob 0 data: 0 
    I:19:13.036105 15230 net.cpp:620]  [Forward] Layer bn4_3, param blob 1 data: 0 
    I:19:13.036114 15230 net.cpp:620]  [Forward] Layer bn4_3, param blob 2 data: 96.1127 
    I:19:13.038148 15230 net.cpp:608]  [Forward] Layer scale4_3, top blob bn4_3 data: 0 
    I:19:13.038189 15230 net.cpp:620]  [Forward] Layer scale4_3, param blob 0 data: 1 
    I:19:13.038230 15230 net.cpp:620]  [Forward] Layer scale4_3, param blob 1 data: 0 
    I:19:13.038969 15230 net.cpp:608]  [Forward] Layer relu4_3, top blob bn4_3 data: 0 
    I:19:13.039417 15230 net.cpp:608]  [Forward] Layer pool4, top blob pool4 data: 0 
    I:19:13.043354 15230 net.cpp:608]  [Forward] Layer conv5_1, top blob conv5_1 data: 0 

    I:19:13.128515 15230 net.cpp:608]  [Forward] Layer score_fr, top blob score_fr data: 0.000975524 
    I:19:13.128569 15230 net.cpp:620]  [Forward] Layer score_fr, param blob 0 data: 0.0135222 
    I:19:13.128607 15230 net.cpp:620]  [Forward] Layer score_fr, param blob 1 data: 0.000975524 
    I:19:13.129696 15230 net.cpp:608]  [Forward] Layer upscore, top blob upscore data: 0.000790174 
    I:19:13.129734 15230 net.cpp:620]  [Forward] Layer upscore, param blob 0 data: 0.25 
    I:19:13.130656 15230 net.cpp:608]  [Forward] Layer score, top blob score data: 0.000955503 
    I:19:13.130709 15230 net.cpp:608]  [Forward] Layer score_score_0_split, top blob score_score_0_split_0 data: 0.000955503 
    I:19:13.130754 15230 net.cpp:608]  [Forward] Layer score_score_0_split, top blob score_score_0_split_1 data: 0.000955503 
    I:19:13.146767 15230 net.cpp:608]  [Forward] Layer accuracy, top blob accuracy data: 1 
    I:19:13.148967 15230 net.cpp:608]  [Forward] Layer loss, top blob loss data: 105320 
    I:19:13.149173 15230 net.cpp:636]  [Backward] Layer loss, bottom blob score_score_0_split_1 diff: 0.319809 
    I:19:13.149323 15230 net.cpp:636]  [Backward] Layer score_score_0_split, bottom blob score diff: 0.319809 
    I:19:13.150310 15230 net.cpp:636]  [Backward] Layer score, bottom blob upscore diff: 0.204677 
    I:19:13.152452 15230 net.cpp:636]  [Backward] Layer upscore, bottom blob score_fr diff: 253.442 
    I:19:13.153218 15230 net.cpp:636]  [Backward] Layer score_fr, bottom blob bn7 diff: 9.20469 
    I:19:13.153254 15230 net.cpp:647]  [Backward] Layer score_fr, param blob 0 diff: 0 
    I:19:13.153291 15230 net.cpp:647]  [Backward] Layer score_fr, param blob 1 diff: 20528.8 
    I:19:13.153420 15230 net.cpp:636]  [Backward] Layer drop7, bottom blob bn7 diff: 9.21666 
    I:19:13.153554 15230 net.cpp:636]  [Backward] Layer relu7, bottom blob bn7 diff: 0 
    I:19:13.153856 15230 net.cpp:636]  [Backward] Layer scale7, bottom blob bn7 diff: 0 
    E:19:14.382714 15230 net.cpp:736]  [Backward] All net params (data, diff): L1 norm = (19254.6, 102644); L2 norm = (391.485, 57379.6) 

Я действительно ценю, если кто-то знает, пожалуйста, поделитесь идеями/ссылками/ресурсами здесь. Еще раз спасибо

+0

IMHO, я не думаю, что добавление 'bias_term' в' 'Deconvolution '' - хорошая идея. У вас есть ['' BatchNorm "' layers] (http://stackoverflow.com/q/41608242/1714410) в вашей модели? Какую активацию вы используете поверх линейных единиц, «ReLU»? Вы пытались установить ['debug_info: true'] (http://stackoverflow.com/questions/40510706/how-to-interpret-caffe-log-with-debug-info) и проверять журнал отладки? – Shai

+0

@Shai Большое спасибо за редактирование и за ваши рекомендации. Нет, я не сильно изменил модель FCN, так как я недостаточно хорошо знаком со слоями и их архитектурой. Вы правы, изменение 'bias_term' ничего не меняло на выходе. Могу ли я спросить, какова же цель слоя «BatchNorm»? Это нормализация данных? Было бы необходимо, так как я уже нормализовал свои изображения между 0-1, прежде чем создавать базу данных LMDB? Еще один вопрос: насколько свобода мы должны изменить архитектуру модели? –

+0

@ S.EB В своем ответе я добавил некоторую информацию о пакетной нормализации. Также см. Http://stackoverflow.com/questions/41608242/how-should-batchnorm-layer-be-used-in-caffe. Если у вас есть дополнительные вопросы, вы можете задать отдельные вопросы. – Jonathan

ответ

1

Я бы не ожидал изменения значений смещения, чтобы помочь с обучением.Первое, что я хотел бы попробовать, это снизить скорость обучения. Вы можете сделать это вручную, переучивая веса, достигшие плато, и используйте решатель с более низким base_lr. Или вы можете изменить свой solver.prototxt, чтобы использовать другую политику обновлений. Вы можете либо установить способ на шаг, либо использовать политику обновления, такую ​​как Adam. См:

http://caffe.berkeleyvision.org/tutorial/solver.html

Как @Shai recommends, добавив "BatchNorm" слои должны помочь. Пакетная нормализация похожа на «отбеливание»/нормализацию входных данных, но применяется к промежуточным слоям. Бумага о нормализации партии находится на arxiv.

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

+0

Джонатан и Шай Спасибо за вашу помощь, я попробую, и я отредактирую и принесу результаты здесь. –

0

Относительно "BatchNorm" параметры:
Этот слой имеет три внутренних параметров: (0) означают, (1) дисперсии, и (2) скользящего среднего коэффициента, независимо от количества каналов или формы вашего BLOB. Поэтому, если вы хотите явно установить lr_mult, вам необходимо определить его для всех трех.

Что касается нулей в журнале:
Пожалуйста, read this post о том, как читать журнал отладки caffe.
Кажется, что вы тренируете свою модель с нуля (не точная настройка) и что все веса установлены на ноль. Это очень плохая стратегия инициализации.
Пожалуйста, определите filler s и bias_filler s для инициализации весов.