tensorflow tf.extract_image_patches

时间:2017-10-25 05:36:39

标签: python tensorflow conv-neural-network

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.

这只会让我更加困惑,因为步幅和费率之间有什么区别?如果有人能用简单的例子和​​简单的语言解释费率参数是什么,我将不胜感激?我看到了一些从给定图像中提取图像块的示例,在所有图像中,使用的值是[1, 1, 1, 1]。应该一直是1吗?需要帮助。

1 个答案:

答案 0 :(得分:0)

以下是该方法的工作原理:

  • ksizes用于确定每个补丁的尺寸,换句话说,每个补丁应包含的像素数。
  • strides表示原始图像中一个色块的开头与下一个连续色块的开始之间的间隙长度。
  • rates是一个数字,实际上意味着我们的补丁应该在原始图像中跳过rates像素,这些像素最终会出现在我们的补丁中。 (以下示例有助于说明这一点。)
  • padding是" VALID",这意味着每个补丁必须完全包含在图像中,或者#34; 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_rowsout_cols