Tensorflow中的独立图像补丁提取操作

时间:2016-05-24 08:09:51

标签: neural-network tensorflow convolution

Tensorflow docs中,tf.nn.conv2d - 操作被描述为:

  1. 将滤镜展平为形状为[filter_height * filter_width * in_channels, output_channels]的二维矩阵。
  2. 从输入张量中提取图像块以形成形状为[batch, out_height, out_width, filter_height * filter_width * in_channels]的虚拟张量。
  3. 对于每个补丁,右对乘滤镜矩阵和图像补丁矢量。
  4. 是否有应用 步骤2的操作?我在API文档中找不到类似的东西。我可能会使用错误的关键字进行搜索。

2 个答案:

答案 0 :(得分:5)

答案 1 :(得分:2)

我想这样做的诀窍是:

  1. 使用[filter_height, filter_width, in_channels, output_channels]
  2. 对形状output_channels = filter_height * filter_width * in_channels进行过滤
  3. 以过滤器被展平为二维矩阵的方式修复此过滤器的值(参见您的步骤2),它是单位矩阵。请查看下面的示例代码,了解使用np.eye().reshape()
  4. 执行此操作的简单方法
  5. 执行正常的tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='SAME')
  6. 您现在拥有形状[batch, out_height, out_width, filter_height * filter_width * in_channels]

    的输出

    这是一个简单的代码,用于输入大小为3 * 3的输入图像,包含1个通道(批量大小为1)。

    import tensorflow as tf
    import numpy as np
    
    input_value = np.arange(1, 10).reshape((1, 3, 3, 1))
    input = tf.constant(input_value)
    input = tf.cast(input, tf.float32)
    
    filter_value = np.eye(9).reshape((3, 3, 1, 9))
    filter = tf.constant(filter_value)
    filter = tf.cast(filter, tf.float32)
    
    output = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='SAME')