[英]tensorflow tf.extract_image_patches
extract_image_patches
函数的官方tensorflow文档说:
tf.extract_image_patches(
images,
ksizes,
strides,
rates,
padding,
name=None
)
我了解了除了rates参数之外的所有必需参数。 这样做的原因可能是api文档中给出的解释:
rates: A list of ints that has length >= 4. 1-D of length 4.
Must be: [1, rate_rows, rate_cols, 1]. This is the input stride,
specifying how far two consecutive patch samples are in the input.
Equivalent to extracting patches with
patch_sizes_eff = patch_sizes + (patch_sizes - 1) * (rates - 1),
followed by subsampling them spatially by a factor of rates. This is
equivalent to rate in dilated (a.k.a. Atrous) convolutions.
这只会使我更加困惑,因为步幅和费率之间有什么区别? 如果有人可以用一个简单的例子并用简单的语言来解释rates参数是什么,我将不胜感激。 我看到了一些从给定图像中提取图像补丁的示例,在所有示例中,使用的值为[1, 1, 1, 1]
。 应该总是1吗? 请需要帮助。
该方法的工作原理如下:
ksizes
用于确定每个补丁的尺寸,即每个补丁应包含多少像素。 strides
表示原始图像中一个色块的起点与下一个连续色块的起点之间的间隙长度。 rates
是一个数字,从本质上讲,我们的补丁应该针对最终出现在我们补丁中的每个连续像素,以原始图像中的像素为rates
跳变。 (以下示例有助于说明这一点。) padding
要么是“ VALID”(有效),这意味着每个色块必须完全包含在图像中,要么是“ SAME”(这意味着色块不完整(剩余像素将用零填充))。 这是一些示例代码,带有输出以帮助演示其工作方式:
import tensorflow as tf
n = 10
# images is a 1 x 10 x 10 x 1 array that contains the numbers 1 through 100 in order
images = [[[[x * n + y + 1] for y in range(n)] for x in range(n)]]
# We generate four outputs as follows:
# 1. 3x3 patches with stride length 5
# 2. Same as above, but the rate is increased to 2
# 3. 4x4 patches with stride length 7; only one patch should be generated
# 4. Same as above, but with padding set to 'SAME'
with tf.Session() as sess:
print tf.extract_image_patches(images=images, ksizes=[1, 3, 3, 1], strides=[1, 5, 5, 1], rates=[1, 1, 1, 1], padding='VALID').eval(), '\n\n'
print tf.extract_image_patches(images=images, ksizes=[1, 3, 3, 1], strides=[1, 5, 5, 1], rates=[1, 2, 2, 1], padding='VALID').eval(), '\n\n'
print tf.extract_image_patches(images=images, ksizes=[1, 4, 4, 1], strides=[1, 7, 7, 1], rates=[1, 1, 1, 1], padding='VALID').eval(), '\n\n'
print tf.extract_image_patches(images=images, ksizes=[1, 4, 4, 1], strides=[1, 7, 7, 1], rates=[1, 1, 1, 1], padding='SAME').eval()
输出:
[[[[ 1 2 3 11 12 13 21 22 23]
[ 6 7 8 16 17 18 26 27 28]]
[[51 52 53 61 62 63 71 72 73]
[56 57 58 66 67 68 76 77 78]]]]
[[[[ 1 3 5 21 23 25 41 43 45]
[ 6 8 10 26 28 30 46 48 50]]
[[ 51 53 55 71 73 75 91 93 95]
[ 56 58 60 76 78 80 96 98 100]]]]
[[[[ 1 2 3 4 11 12 13 14 21 22 23 24 31 32 33 34]]]]
[[[[ 1 2 3 4 11 12 13 14 21 22 23 24 31 32 33 34]
[ 8 9 10 0 18 19 20 0 28 29 30 0 38 39 40 0]]
[[ 71 72 73 74 81 82 83 84 91 92 93 94 0 0 0 0]
[ 78 79 80 0 88 89 90 0 98 99 100 0 0 0 0 0]]]]
因此,例如,我们的第一个结果如下所示:
* * * 4 5 * * * 9 10
* * * 14 15 * * * 19 20
* * * 24 25 * * * 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50
* * * 54 55 * * * 59 60
* * * 64 65 * * * 69 70
* * * 74 75 * * * 79 80
81 82 83 84 85 86 87 88 89 90
91 92 93 94 95 96 97 98 99 100
如您所见,我们有2行和2列的补丁程序,分别是out_rows
和out_cols
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.