Обратное распространение в сверточных нейронных сетях и как обновлять фильтры

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

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

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

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

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




Ответы (1)


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

Если кратко ответить на некоторые ваши вопросы:

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

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

Кроме того, вы можете найти хорошую демонстрацию сверток здесь.

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

person DocDriven    schedule 14.05.2018
comment
Спасибо за Ваш ответ. Вы знаете, я много читал о CNN, но каждая статья, которую я читаю, заканчивается Tensorflow и т. д. Но я хочу знать, что происходит под капотом. Например, чтобы сделать слой свертки, после прочтения некоторых руководств я подумал, что это можно реализовать с помощью метода im2col, но я понятия не имею, как может происходить обратное распространение. В другом уроке я увидел, что реализация конверсионного слоя — это метод, использующий быстрое преобразование Фурье (fft). Я запутался! Метод im2col неверен? Есть ли какой-либо стандарт по этому поводу? Каков эффективный способ? моя основная проблема - это конверсионный слой и резервная копия... - person Fcoder; 14.05.2018
comment
Есть несколько способов реализовать это, нет правильного или неправильного. Просто выберите один и попытайтесь запустить его. Если вас беспокоит производительность, вы в конечном итоге будете использовать решения, разработанные для этой цели, такие как tensorflow или pytorch. Если вы застряли, просто опубликуйте свой код, чтобы мы могли вам помочь. - person DocDriven; 14.05.2018
comment
Вы знаете, я думаю, что причина моего замешательства в том, что каждая статья или учебник, которые я читал, имеют свой собственный метод для этого! И ни один из них не заметил, что это просто метод помимо других и его можно реализовать разными способами. Я хотел соединить их и получить метод реализации, но каждая статья, которую я читал, только больше меня смущала... Спасибо, что помогли мне в этом. Вы сделали мой день! - person Fcoder; 14.05.2018