Я обнаружил, что для создания (X - x + 1, Y - y + 1)
патчей размером (x,y)
из (X,Y)
с шагом 1 изображение требует, чтобы мы задавали параметр шага как img.strides * 2
или img.strides + img.strides
. Я не знаю, как они быстро вычисляют это, зная "нет". шагов в conv2d
Но что мне делать, чтобы получить ((X-x)/stride)+1, ((Y-y)/stride)+1
патчей одного размера из изображения того же размера с шагом stride
?
Из этого SO ответ с небольшим изменением, с каналами и количеством изображений, размещенных впереди
def patchify(img, patch_shape):
a,b,X, Y = img.shape # a images and b channels
x, y = patch_shape
shape = (a, b, X - x + 1, Y - y + 1, x, y)
a_str, b_str, X_str, Y_str = img.strides
strides = (a_str, b_str, X_str, Y_str, X_str, Y_str)
return np.lib.stride_tricks.as_strided(img, shape=shape, strides=strides)
Я вижу, что он создает скользящее окно с размером (x, y) и шагом 1 (перемещение на 1 пиксель вправо и перемещение на 1 пиксель вниз). У меня возникли проблемы с соотнесением параметра шагов, который использует as_strided
, и шагов, которые мы обычно используем для conv2d.
Как добавить параметр в приведенную выше функцию, которая вычисляет параметр as_strided
шагов?
def patchify(img, patch_shape, stride): # stride=stepsize in conv2d eg: 1,2,3,...
a,b,X,Y = img.shape # a images and b channels
x, y = patch_shape
shape = (a,b,((X-x)/stride)+1, ((Y-y)/stride)+1, x, y)
strides = ??? # strides for as_strided
return np.lib.stride_tricks.as_strided(img, shape=shape, strides=strides)
изображение 4d (a, b, X, Y)
a
=количество изображений,b
=количество каналов,(X,Y)
= ширина и высота
Примечание. Под stride in conv2d
я подразумеваю stepsize
К сожалению, это также называется шагом.
Примечание 2. Поскольку stepsize
обычно будет одинаковым по обеим осям, в предоставленном коде я указал только один параметр, однако использовал его для обоих измерений.
Детская площадка: что нужно для strides
здесь. У меня он работает для stepsize=1
здесь. Я заметил, что это может не работать по ссылке, но работает при вставке в новую игровую площадку а>.
Это должно дать четкое представление о том, что мне нужно:
[[ 0.5488135 0.71518937 0.60276338 0.54488318]
[ 0.4236548 0.64589411 0.43758721 0.891773 ]
[ 0.96366276 0.38344152 0.79172504 0.52889492]
[ 0.56804456 0.92559664 0.07103606 0.0871293 ]]
# patch_size = 2x2
# stride = 1,1
[[[[ 0.5488135 0.71518937]
[ 0.4236548 0.64589411]]
[[ 0.71518937 0.60276338]
[ 0.64589411 0.43758721]]
[[ 0.60276338 0.54488318]
[ 0.43758721 0.891773 ]]]
[[[ 0.4236548 0.64589411]
[ 0.96366276 0.38344152]]
[[ 0.64589411 0.43758721]
[ 0.38344152 0.79172504]]
[[ 0.43758721 0.891773 ]
[ 0.79172504 0.52889492]]]
[[[ 0.96366276 0.38344152]
[ 0.56804456 0.92559664]]
[[ 0.38344152 0.79172504]
[ 0.92559664 0.07103606]]
[[ 0.79172504 0.52889492]
[ 0.07103606 0.0871293 ]]]]
# stride = 2,2
[[[[[[ 0.5488135 0.71518937]
[ 0.4236548 0.64589411]]
[[ 0.60276338 0.54488318]
[ 0.43758721 0.891773 ]]]
[[[ 0.96366276 0.38344152]
[ 0.56804456 0.92559664]]
[[ 0.79172504 0.52889492]
[ 0.07103606 0.0871293 ]]]]]]
# stride = 2,1
[[[[ 0.5488135 0.71518937]
[ 0.4236548 0.64589411]]
[[ 0.71518937 0.60276338]
[ 0.64589411 0.43758721]]
[[ 0.60276338 0.54488318]
[ 0.43758721 0.891773 ]]]
[[[ 0.96366276 0.38344152]
[ 0.56804456 0.92559664]]
[[ 0.38344152 0.79172504]
[ 0.92559664 0.07103606]]
[[ 0.79172504 0.52889492]
[ 0.07103606 0.0871293 ]]]]
img.strides
, и ваш входной параметрstride
. Это две разные вещи. Вашstride
, который я чувствую, больше похож на размер шага. Образец дела было бы неплохо, чтобы прояснить ситуацию. - person Divakar   schedule 24.11.2017strides
вместоas_strided
следует указать для неперекрывающихся патчей или stepsize=patch_size в каждом измерении? - person Saravanabalagi Ramachandran   schedule 24.11.2017