1

Я работаю в распознавании лиц с глубокой нейронной сетью. Я использую базу данных CASIA-webface 10575 классов для обучения глубокому CNN (используется CASIA, см. Раздел paper) из 10 сверток, 5 пулов и 1 полностью подключенный слой. Для активации используется функция "ReLU". Я смог успешно тренировать его, используя и получил желаемую производительность.Невозможно тренироваться/настраиваться с PReLU в caffe

Моя проблема заключается в том, что Я не смогу обучить/точно настроить тот же CNN, используя "PReLU" активация. Сначала я подумал, что простую замену "ReLU" с "PReLU" выполнит эту работу. Тем не менее, ни один из тонкой настройки (из caffemodel, который был изучен с "ReLU") и учиться с нуля стратегии работали.

Чтобы упростить задачу обучения, я значительно сократил набор учебных материалов только на 50 классов. Однако CNN не смог учиться с "PReLU", тогда как он смог учиться с "ReLU".

Для того, чтобы понять, что моя кофейная отлично работает с "PReLU", я проверил его, выполнив простые сети (как с "ReLU" и "PReLU") с использованием данных cifar10, и она работала.

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

+0

Вы изменили какие-либо параметры тренировки? Например, скорость обучения или конвергенция? Точная настройка модели иногда требует точной настройки параметра или двух параметров. Кроме того, я не уверен, где вставлены функции P/ReLU: бумага не вызывает их, поэтому я предполагаю их в обычных местах (рядом с POOL). – Prune

+1

Да, я пробовал с различными параметрами обучения, как вы упомянули. P/ReLU вставлен после слоя Conv. – Hasnat

ответ

2

Основное отличие между "ReLU" ии активацией активации заключается в том, что последняя функция активации имеет ненулевой наклон для отрицательных значений ввода и что этот наклон можно извлечь из данных. Было отмечено, что эти свойства делают тренировку более устойчивой к случайной инициализации весов.
Я использовал "PReLU" активацию для тонкой настройки сетей, которые были обучены первоначально с "ReLU" и я испытал более быструю и надежную конвергенцию.

Мое предложение заключается в замене "ReLU" со следующей конфигурацией

layer { 
    name: "prelu" 
    type: "PReLU" 
    bottom: "my_bottom" 
    top: "my_bottom" # you can make it "in-place" to save memory 
    param { lr_mult: 1 decay_mult: 0 } 
    prelu_param { 
    filler: { type: "constant" val: 0 } 
    channel_shared: false 
    } 
} 

Обратите внимание, что инициализация отрицательного наклона 0, то "PReLU" активаций в-действительности же, как "ReLU", так что вы начинаете тонкую настройку с точно то же место, что и ваша оригинальная сеть.

Также обратите внимание, что я явно задал коэффициенты скорости обучения и скорости распада (1 и 0 соответственно) - вам может потребоваться немного изменить эти параметры, хотя я считаю, что установка decay_weight на любое значение, отличное от нуля, не является мудрый.

1

Я смог отлично тренироваться с помощью PReLu для своей сети, хотя и с более низкой точностью, используя ReLu. И да, я просто поменял ReLu и PReLu.

Однако я почти всегда заметил, что PReLU сходится намного быстрее, чем ReLu. Итак, возможно, вам нужно снизить уровень обучения?

+0

Я пробовал со многими различными скоростями обучения от 0,1 до 0,00001. Я использую решение SGD по умолчанию. – Hasnat

+0

У меня такой же опыт: чистая тренировка с ReLU, тонкая настройка его на другую БД с использованием PReLU работает намного лучше. – Shai

1

Два основных наблюдения:

  • PReLU не гарантирует получения результатов более точные, чем те, с РЕЛУ. Он работал лучше с AlexNet на ImageNet, но это просто предполагает дальнейшие исследования и уточнения; он не обязательно переносится в другие приложения.
  • CIFAR, ImageNet и CASIA-webface не являются идентичными приложениями.

Вы уже сделали правильный первый шаг, изменив скорость обучения. Затем я попытаюсь изменить параметры командной строки: измените эпсилон конвергенции, импульс, распад веса или другие параметры внутренней настройки. Иногда для этого требуется небольшая настройка, чтобы использовать даже незначительное изменение топологии.

Измените размер партии ввода. Можно ли изменить топологию другими способами, например, изменить уровень свертки? Вы можете увидеть, что у вас есть с другим подходом к фильтрам CONV2.

+0

Несколько недавних работ получили лучшие результаты на тех же CNN и DB, заменив ReLU на PReLU. Поэтому моя цель - добиться более высокой производительности, следуя этому, а не изменять конфигурацию сети. Я могу пойти на изменение эпсилона сближения, импульса и т. Д. Но вопрос в том, какой уровень обучения я должен изменить? У меня есть некоторая неопределенность в отношении решателя типа. Любое предложение для этого? – Hasnat

+0

Хорошо; который удаляет несколько моих предложений. Для остальных я попытался бы с исходной скоростью обучения, изменив остальные на 1,5-кратный коэффициент в каждом направлении. Я не так хорошо знаком с основным шагом в изменении решателя, но ... вы используете SoftMax? – Prune

+0

Да, SoftMax. Я использую решатель SGD. Я не знаю, поможет ли изменение типа решателя (например, ADAM)! – Hasnat