2016-03-07 4 views
1

Pithy: Справка с скриптом Matlab, который принимает массив ImageData и весов свертки из Caffe и возвращает свертку. Пожалуйста.Реализация свертки как матричное умножение


Я пытаюсь воссоздать свертку, порожденную Caffe в Matlab.

Давайте сделаем следующие определения

W**2 = Size of input 
F**2 = Size of filter 
P = Size of padding 
S = Stride 
K = Number of filters 

Следующий текст описывает, как обобщить свертку как матричного умножения:

Местные регионы входного изображения растянуты в столбцы в обычно называется im2col. Например, если вход является [227x227x3] и он должен быть свернут с фильтрами 11x11x3 на шаге 4, тогда мы возьмем [11x11x3] блоки пикселей на входе и растянем каждый блок в вектор-столбец размером 11 * 11 * 3 = 363. Итерируя этот процесс на входе с шагом 4, получаем (227-11)/4 + 1 = 55 местоположений вдоль ширины и высоты, что приводит к выходной матрице X_col из im2col размера [363 x 3025], где каждый столбец является растянутым восприимчивым полем, и в целом 55 * 55 = 3025 из них. Обратите внимание, что поскольку перекрывающиеся рецептивные поля перекрываются, каждое число во входном томе может дублироваться в нескольких разных столбцах.

Исходя из этого, можно сделать вывод о том, что вызов функции im2col будет выглядеть примерно так:

input = im2col(input, [3*F*F, ((W-F)/S+1)**2)]) 

Однако, если я использую следующие параметры-значения

W = 5 
F = 3 
P = 1 
S = 2 
K = 2 

I получить следующие размеры:

>> size(input) 

ans = 

    1  3  5  5 

>> size(output) 

ans = 

    1  2  3  3 

>> size(filter) 

ans = 

    2  3  3  3 

И если я использую вызов функции im2col сверху, я получаю пустую матрицу.

Если я изменил шаг на 1 в приведенном выше примере, размер входа, выхода и фильтра останется прежним. Если я использую команду «convn» от Matlab, размер не совпадает с фактическим выводом Caffe.

>> size(convn(input,filter))         

ans = 

    2  5  7  7 

Что бы общий способ изменить размер массива для матричного умножения?

ответ

0

Вы используете второй аргумент в im2col неправильно, см. the documentation.

Вы должны дать ему размер окна фильтра, который вы пытаетесь скользить по изображению, т.е .:

cols = im2col(input, [F, F]) 
+0

Спасибо за ваш ответ! Я до сих пор не знаю, как вы могли бы умножить cols на фильтр. Размер cols становится 9 чем-то, а размер фильтра равен 3. –

+0

@ V.Vocor: Размер фильтра равен 3x3. Вы должны переинтерпретировать его как вектор-столбец размером 9, а затем вы можете просто взять точечный продукт этого вектора фильтра и столбцов изображения. – cfh

+0

Мой плохой. Еще раз спасибо! –

Смежные вопросы