在keras中,如何修改张量的某些切片(例如x [:32,:32] = np.random.rand(32,32))

时间:2019-01-21 01:09:50

标签: tensorflow keras

我想将不同的Conv2D滤镜应用于keras中图像大小相等的子部分,然后将卷积后的子部分缝合回原处。我知道我将如何使用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]])

就像我刚开始所说的那样,我想在keras中做同样的事情,在这里我用不同的滤镜对每个子部分(切片)进行卷积,然后将所有内容重新放回到一个2D数组中。

我认为我对如何分割张量并将卷积应用于每个小节有一个角度,但对于如何将它们全部放回原处有个角度。在这里,a将是形状为(1,6,6,1)的4-D张量

 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??

关于在此执行的最后一步的任何想法,甚至更好,

0 个答案:

没有答案