Обновление весов фильтра в CNN - PullRequest
0 голосов
/ 04 июня 2019

Я разработал CNN с 2 слоями свертки, за которыми следуют 2 полностью соединенных слоя.

Архитектура моей CNN выглядит следующим образом:

Input -> [Conv1->ReLU->Pool] -> [Conv2->ReLU->Pool] -> FC1 -> FC2 -> output

28x28   28x28         14x14      14x14           7x7     49x1   49x1    10x1  

Во время обучения CNN я применил обратное распространение до полностью подключенных слоев. Без обновления фильтров я получаю точность около 94%, но мне нужно обновить фильтры для полноценного функционирования.

Я не могу понять, как я могу распространить ошибку от слоя FC к фильтрам в слое conv.

Я ссылался на различные источники, но ни один из них мне не помог. Как распространить ошибку от слоя 49x49 FC на фильтр 3x3 в слое conv?

Может кто-нибудь помочь мне с этим?

Спасибо.

1 Ответ

0 голосов
/ 05 июня 2019

Так же, как вы делали для полностью связанных слоев, но со сверткой вместо умножения матриц.Предположим, вы на 5 уровне (L5).Во время backprop у вас есть дельта-матрица, которую вы вычислили на L6, назовем это D6.В L5 у вас есть 2 задачи ... Вам нужно рассчитать dF, который вы будете использовать для обновления фильтров, и вам нужно рассчитать D5, который вы будете использовать как дельту в L4.

Как вы выполняли это вплотные слои?Для dW вы умножили вход слоя на дельту, а для следующей дельты вы умножили дельту на веса и производную функции активации.

Теперь приходит волшебство ... Если у вас есть слой с конвоями, сделайте дикое предположение, что вы делаете.Позвольте мне немного помочь.Для расчета dF вы сворачиваете D6 с исходным входом в L5.Выглядит знакомо, я надеюсь.И чтобы получить следующую дельту, вы выполняете полную свертку оригинальных фильтров с D6 и передаете это в L4.Слои пула содержат миллиарды ресурсов, и они довольно просты, поэтому я лучше их пропустить.

Если вы используете python, это хорошая практика, но не ожидайте, что она будет полезна.Это ужасно медленный процесс, поэтому для чего-то большего, чем тренировка, используйте какой-нибудь фреймворк, например tenorflow / keras / и т. Д.

...