我想将不同的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??
关于在此执行的最后一步的任何想法,甚至更好,