В keras, как вы изменяете определенные куски тензора (например, x [: 32,: 32] = np.random.rand (32,32)) - PullRequest
0 голосов
/ 21 января 2019

Я хотел бы применить другой фильтр 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??

Любые идеи о последнем шаге, который можно сделать здесь, или , даже лучше, какой будет более подходящий метод?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...