demo代码:
import tensorflow as tf
import numpy as np
x_pad = np.reshape(np.arange(0,4*4*8),[1,4,4,8])
x = tf.placeholder(tf.int32,[1,4,4,8])
y = tf.space_to_depth(x,block_size=2)
z = tf.reshape(x,[1,2,2,32])
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
with tf.Session(config = config) as sess:
y_out,z_out = sess.run([y,z],{x:x_pad})
print('x_pad:')
print(x_pad)
print('y_out:')
print(y_out)
print('z_out:')
print(z_out)
运行结果如下:
x_pad:
[[[[ 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 36 37 38 39]
[ 40 41 42 43 44 45 46 47]
[ 48 49 50 51 52 53 54 55]
[ 56 57 58 59 60 61 62 63]]
[[ 64 65 66 67 68 69 70 71]
[ 72 73 74 75 76 77 78 79]
[ 80 81 82 83 84 85 86 87]
[ 88 89 90 91 92 93 94 95]]
[[ 96 97 98 99 100 101 102 103]
[104 105 106 107 108 109 110 111]
[112 113 114 115 116 117 118 119]
[120 121 122 123 124 125 126 127]]]]
y_out:
[[[[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 32
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47]
[ 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 48
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63]]
[[ 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 96
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111]
[ 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 112
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127]]]]
z_out:
[[[[ 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 36 37 38 39 40 41 42 43 44 45 46 47 48
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63]]
[[ 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95]
[ 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127]]]]
解释:从图像角度来看(假设正方形图像),tf.space_to_depth(x,block_size=2)相当于在高和宽的方向上每隔(block_size-1)像素采样(像分离卷积),这样会多出block_sizeblock_size倍个采样结果,将它们合并到通道上; tf.reshape(x,[1,2,2,32])想当于在每条像素上(就是矩阵的同一列元素)采样,这样也会多出block_sizeblock_size倍个采样结果,将它们合并到通道上。