Я хотел бы применить другой фильтр Conv2D к подразделам изображения одинакового размера в кератах, а затем сшить свернутые подразделы вместе в местах, откуда они пришли. Я знаю, как бы я сделал это с массивами numpy (не красиво, но это работает):
a=np.arange(36).reshape(6,6)
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23],
[24, 25, 26, 27, 28, 29],
[30, 31, 32, 33, 34, 35]])
Я бы хотел разделить его на четыре подраздела, сделать что-то отдельное для каждого раздела, а затем собрать все вместе в один массив изображений. Вот рабочий пример.
#split into 4 3x3 slices
b=[]
for i in range(0,6,3):
for j in range(0,6,3):
b.append(a[i:i+3,j:j+3])
print(np.array(b))
array([[[ 0, 1, 2],
[ 6, 7, 8],
[12, 13, 14]],
[[ 3, 4, 5],
[ 9, 10, 11],
[15, 16, 17]],
[[18, 19, 20],
[24, 25, 26],
[30, 31, 32]],
[[21, 22, 23],
[27, 28, 29],
[33, 34, 35]]])
# Do some stuff to each slice individually:
for i in range(4):
b[i]*=i
# put the slices back together where they came from
c=np.zeros_like(a)
for n,i in enumerate(range(0,6,3)):
for m,j in enumerate(range(0,6,3)):
c[i:i+3,j:j+3]=b[m+2*n]
print(c)
array([[ 0, 0, 0, 3, 4, 5],
[ 0, 0, 0, 9, 10, 11],
[ 0, 0, 0, 15, 16, 17],
[ 36, 38, 40, 63, 66, 69],
[ 48, 50, 52, 81, 84, 87],
[ 60, 62, 64, 99, 102, 105]])
Как я уже сказал в начале, я бы хотел сделать то же самое в кератах, где я свертываю каждый из подразделов (срезов) с помощью другого фильтра, а затем снова собираю все вместе в один двумерный массив.
Я думаю, что у меня есть представление о том, как разделить тензор и применить свертку к каждому подразделу, но не о том, как собрать все это вместе. Здесь a
будет 4-D тензор формы (1,6,6,1)
from keras.layers inport Lambda,Conv2D
for i in range(0,6,3):
for j in range(0,6,3):
b = Lambda(lambda z: z[:, i:i+3, j:j+3,:])(a)
b = Conv2D(3,padding='same')(b)
# how do I put b back into the right place in a??
Любые идеи о последнем шаге, который можно сделать здесь, или , даже лучше, какой будет более подходящий метод?