Обратное распространение в сверточных нейронных сетях и как обновить фильтры - PullRequest
0 голосов
/ 13 мая 2018

Я узнаю о Convolutional Neural Network s, и сейчас я не совсем понимаю, как это реализовать.

Я знаю о регулярных нейронных сетях и таких понятиях, как Gradient Descent и Back Propagation, и я могу понять, как CNN работает интуитивно.

Мой вопрос касается обратного распространения в CNN. Как это происходит? Последними полностью связанными слоями являются обычные нейронные сети, и в этом нет никаких проблем. Но как я могу обновить фильтры в слоях свертки? Как я могу вернуть ошибку распространения от полностью подключенных слоев к этим фильтрам? У меня проблема с обновлением фильтров!

Фильтры только простые матрицы? Или они имеют такие структуры, как обычные NN, и связи между слоями имитируют эту возможность? Я читал о Sparse Connectivity и Shared Weights, но не могу связать их с CNN. Я действительно смущен внедрением CNN, и я не могу найти какие-либо учебные пособия, которые говорят об этой концепции Я не могу читать документы, потому что я новичок в этом, и моя математика не очень хорошая.

Я не хочу использовать TensorFlow или подобные инструменты, я изучаю основную концепцию и использую чистый Python.

1 Ответ

0 голосов
/ 14 мая 2018

Прежде всего, я могу порекомендовать это введение в CNN. Может быть, с этим лучше понять идею.

Чтобы ответить на некоторые ваши вопросы вкратце:

Допустим, вы хотите использовать CNN для классификации изображений. Картинка состоит из NxM пикселей и имеет 3 канала (RBG). Чтобы нанести сверточный слой на него, вы используете фильтр. Фильтры - это матрицы (обычно, но не обязательно) квадратичной формы (например, PxP) и количество каналов, равное количеству каналов представления, к которому оно применяется. Следовательно, первый фильтр уровня Conv также имеет 3 канала. Каналы - это количество слоев фильтра, так сказать.

При применении фильтра к изображению вы делаете нечто, называемое дискретной сверткой. Вы берете свой фильтр (который обычно меньше вашего изображения) и шаг за шагом скользите по нему и вычисляете свертку. Это в основном матричное умножение. Затем вы применяете функцию активации к нему и, возможно, даже к пулу. Важно отметить, что фильтр для всех выполненных сверток на этом слое остается тем же самым, поэтому у вас есть только параметры P * P на слой. Вы настраиваете фильтр таким образом, чтобы он как можно лучше соответствовал тренировочным данным. Вот почему его параметры называются общими весами. При применении GD вы просто должны применить его к упомянутым весам фильтра.

Также вы можете найти хорошее демо для сверток здесь .

Реализация этих вещей, безусловно, возможна, но для начала вы можете попробовать тензорный поток для экспериментов. По крайней мере, так я изучаю новые понятия:)

...