Проблемы с пониманием сверточной нейронной сети
Я читал о сверточных нейронных сетей с здесь. Затем я начал играть с torch7. У меня путаница с сверточным слоем CNN.
от руководства
1
The neurons in a layer will only be connected to a small region of the layer before it, instead of all of the neurons in a fully-connected manner.
2
For example, suppose that the input volume has size [32x32x3], (e.g. an RGB CIFAR-10 image). If the receptive field is of size 5x5, then each neuron in the Conv Layer will have weights to a [5x5x3] region in the input volume, for a total of 5*5*3 = 75 weights.
3
если входной слой [32x32x3], CONV layer will compute the output of neurons that are connected to local regions in the input, each computing a dot product between their weights and the region they are connected to in the input volume. This may result in volume such as [32x32x12].
Я начал играть с тем, что слой CONV может сделать с изображением. Я сделал это в torch7. Вот моя реализация,
require 'image'
require 'nn'
i = image.lena()
model = nn.Sequential()
model:add(nn.SpatialConvolutionMM(3, 10, 5, 5)) --depth = 3, #output layer = 10, filter = 5x5
res = model:forward(i)
itorch.image(res)
print(#i)
print(#res)
3
512
512
[torch.LongStorage of size 3]
10
508
508
[torch.LongStorage of size 3]
теперь давайте посмотрим структуру CNN
Итак, мои вопросы,
Вопрос 1
свертка сделана так - скажем, мы берем изображение 32x32x3. И есть фильтр 5x5. Затем фильтр 5x5 будет проходить через все изображение 32x32 и создавать запутанные изображения? Хорошо, поэтому, сдвинув фильтр 5x5 по всему изображению, мы получим одно изображение, если есть 10 выходных слоев, мы получим 10 изображений(как вы видите на выходе). Как мы их получим? (см. изображение для уточнения, если требуется)
Вопрос 2
каково количество нейронов в слое conv? Это количество выходных слоев? В коде, который я написал выше,model:add(nn.SpatialConvolutionMM(3, 10, 5, 5))
. Это 10? (нет. выходных слоев?)
если так пункт 2 не имеет никакого смысла. Согласно этому If the receptive field is of size 5x5, then each neuron in the Conv Layer will have weights to a [5x5x3] region in the input volume, for a total of 5*5*3 = 75 weights.
какой будет вес? Я очень запутался в этом. В модели, определенной в torch, нет веса. Так какую роль здесь играет вес?
может кто-нибудь объяснить, что происходит?
2 ответов
свертка сделана так - скажем, мы берем изображение 32x32x3. И есть фильтр 5x5. Затем фильтр 5x5 будет проходить через все изображение 32x32 и создавать запутанные изображения?
для входного изображения 32x32x3 фильтр 5x5 будет перебирать каждый пиксель и для каждого пикселя смотреть на окрестности 5x5. Этот район содержит 5*5*3=75 значений. Ниже приведен пример изображения для фильтра 3x3 по одному входному каналу, т. е. с окрестности 3*3*1 значения (источник).
для каждого отдельного соседа фильтр будет иметь один параметр (он же вес), поэтому 75 параметров. Затем, чтобы вычислить одно выходное значение (значение в пикселе x, y), он считывает эти соседние значения, умножает каждое из них на соответствующий параметр/вес и добавляет их в конце (см. дискретные свертки). Оптимальные веса должны быть выучены во время обучение.
таким образом, один фильтр будет перебирать изображение и генерировать новый вывод, пиксель за пикселем. Если у вас несколько фильтров (т. е. второй параметр в SpatialConvolutionMM
is >1) Вы получаете несколько выходов ("плоскости" в Факеле).
хорошо, поэтому, сдвинув фильтр 5x5 по всему изображению, мы получаем одно изображение, если есть 10 выходных слоев, мы получаем 10 изображений(как вы видите на выходе). Как мы их получим? (см. изображение для уточнения, если обязательно)
каждая выходная плоскость генерируется собственным фильтром. Каждый фильтр имеет свои параметры (5*5*3 параметры в вашем примере). Процесс для нескольких фильтров точно такой же, как и для одного.
каково количество нейронов в слое conv? Это количество выходных слоев? В коде, который я написал выше, model: add (nn.SpatialConvolutionMM(3, 10, 5, 5)). Это 10? (нет. выходных слоев?)
вы должны позвонить эти веса или параметры, "нейроны" на самом деле не подходят для сверточных слоев. Количество параметров, как описано, 5*5*3=75 в фильтр в вашем примере. Поскольку у вас есть 10 фильтров ("выходные плоскости"), у вас есть 750 параметров. Если вы добавляете второй слой в свою сеть с помощью model:add(nn.SpatialConvolutionMM(10, 10, 5, 5))
у вас будет дополнительный 5*5*10=250 параметров на фильтр и 250*10=2500 всего. Обратите внимание, как это число может быстро расти (512 фильтров / выходных плоскостей в одном слое, работающих на 256 входных плоскостях, - ничто необычный.)
для дальнейшего чтения вы должны посмотреть на http://neuralnetworksanddeeplearning.com/chap6.html . Прокрутите вниз до главы "введение сверточных сетей". В разделе "локальные рецептивные поля" есть визуализации, которые, вероятно, помогут вам понять, что делает фильтр (один был показан выше).
отказ от ответственности: Информация, которую я представил ниже, в основном извлечена из следующих документов: Обработка информации в зрительной коре кошек Градиентное обучение, применяемое для распознавания документов Неокортиган Рецептивные поля в зрительной коре кошки
свертка сделана так - допустим, мы берем изображение 32x32x3. И есть фильтр 5x5. После этого фильтр 5x5 пройдет через все изображение 32x32 и произведет свернутое образы?
да, фильтр 5x5 будет проходить через все изображение, создавая изображение 28x28 RGB. Каждый блок в так называемой "карте объектов" получает входы 5x5x3, подключенные к области 5x5 во входном изображении ( эта область 5x5 называется "локальным рецептивным полем"блока). Рецептивные поля соседних(смежных) единиц на карте объектов центрируются на соседних (смежных) единицах в предыдущем слое.
хорошо, поэтому скользящий фильтр 5x5 по всему изображение, мы получаем одно изображение, если есть 10 выходных слоев, мы получаем 10 изображений (как вы видите на выходе). Как мы их получим? (см. изображение для уточнения, если требуется)
обратите внимание, что единицы слоя векторной карты имеют один и тот же набор wights и выполняют одну и ту же операцию на разных частях изображения.(То есть, если вы сдвинете исходное изображение, вывод на карте объектов также сдвинется на ту же величину). То есть для каждой карты объектов вы ограничиваете набор весов будьте одинаковы для каждой единицы; у вас есть только неизвестные веса 5x5x3.
из-за этого ограничения, и поскольку мы хотим извлечь как можно больше информации из изображения, мы добавляем больше слоев, карты объектов: наличие нескольких карт объектов помогает нам извлекать несколько объектов в каждом пикселе.
к сожалению, я не знаком с Torch7.