【发布时间】:2018-01-15 04:10:46
【问题描述】:
我希望在 TensorFlow 中实现类似于 2D 卷积的操作。根据我的理解,实现卷积的最常见方法是首先对图像应用im2col 操作(参见here - 小节“作为矩阵乘法的实现”) - 一种转换的操作将图像转换为 2D 矩阵,其中将内核应用到的图像的单个“块”作为扁平列。
换句话说,上述链接资源的摘录解释了im2col 的优点:
[...] 例如,如果输入是 [227x227x3] (格式为高 x 宽 x n_channels) 并且要在步长 4 处与 11x11x3 滤波器进行卷积,那么我们将在输入中获取 [11x11x3] 个像素块,并将每个块拉伸成大小为 11*11*3 = 363 的列向量。在输入中以 4 的步幅迭代此过程得到 (227-11)/4+1 =沿宽度和高度的 55 个位置,导致大小为 [363 x 3025] 的
im2col的输出矩阵X_col,其中每一列都是拉伸的感受野,总共有 55*55 = 3025 个。请注意,由于感受野重叠,输入卷中的每个数字都可能在多个不同的列中重复。
据我从TensorFlow docs 了解到,tf.nn.conv2d 内部也是如此。
现在,我想在 TensorFlow 中单独实现上述im2col 操作(因为我希望能够访问这个中间结果)。由于这涉及以非平凡的方式复制值,我如何自己为这个操作构建一个相对有效的计算图?同样,如何实现反向操作?
【问题讨论】:
标签: python machine-learning tensorflow neural-network conv-neural-network