当前位置: 首页 > 面试题库 >

Tensorflow:对于小批量中的每个样本,使用不同的滤波器进行卷积

曹奇文
2023-03-14
问题内容

我想使用一个二维卷积滤波器,该滤波器取决于张量流中迷你批处理中的样本。有什么想法可以做到的,特别是如果每​​个小批量的样品数量未知时?

具体来说,我有inp表单的输入html" target="_blank">数据MB x H x W x Channels,并且有F表单的过滤器MB x fh x fw x Channels x OutChannels

假设

inp = tf.placeholder('float', [None, H, W, channels_img], name='img_input')

我想这样做tf.nn.conv2d(inp, F, strides = [1,1,1,1]),但这是不允许的,因为F不能具有最小批量尺寸。任何想法如何解决这个问题?


问题答案:

我认为建议的技巧实际上是不正确的。tf.conv3d()图层发生的事情是将输入卷积到深度(=实际批处理)维度上,然后沿着结果要素图求和。随着padding='SAME'所产生的产出数量则恰好是同批大小,这样一个被愚弄!

编辑:我认为对不同的迷你批处理元素使用不同的滤镜进行卷积的一种可能方法涉及“破解”深度卷积。假设批量大小MB已知:

inp = tf.placeholder(tf.float32, [MB, H, W, channels_img])

# F has shape (MB, fh, fw, channels, out_channels)
# REM: with the notation in the question, we need: channels_img==channels

F = tf.transpose(F, [1, 2, 0, 3, 4])
F = tf.reshape(F, [fh, fw, channels*MB, out_channels)

inp_r = tf.transpose(inp, [1, 2, 0, 3]) # shape (H, W, MB, channels_img)
inp_r = tf.reshape(inp, [1, H, W, MB*channels_img])

out = tf.nn.depthwise_conv2d(
          inp_r,
          filter=F,
          strides=[1, 1, 1, 1],
          padding='VALID') # here no requirement about padding being 'VALID', use whatever you want. 
# Now out shape is (1, H, W, MB*channels*out_channels)

out = tf.reshape(out, [H, W, MB, channels, out_channels) # careful about the order of depthwise conv out_channels!
out = tf.transpose(out, [2, 0, 1, 3, 4])
out = tf.reduce_sum(out, axis=3)

# out shape is now (MB, H, W, out_channels)

如果MB未知,应该可以使用tf.shape()(我认为)动态确定



 类似资料:
  • 在resnet的某个阶段,每个图像有6个特征,即每个示例的形状为1X8X8X6,我希望每个特征都包含4个大小为1x2x1x1的常量过滤器(DWT),步长为2,以便在下一层中获得24个特征,并将图像变为1X4X4X24。然而,我无法使用tf。nn。conv2d或tf。nn。卷积为此,conv2d说输入的第四维等于滤波器的第三维,但我如何才能做到这一点,我尝试了第一个滤波器,但即使这样也不起作用:

  • 例如,我们有3个通道(红色、绿色、蓝色)的RGB图像。我们使用卷积神经网络。 每个卷积滤波器是否总是对图像的每个通道(R、G、B)具有3个不同的系数? > 即filter-W1是否有3个不同的系数矩阵:如下图所示? 或者在现代神经网络的一个滤波器中经常使用相同的系数(<代码>W1[::0]=W1[::1]=W1[::2] )? 链接:http://cs231n.github.io/convolut

  • 我想创建一个包含一些元素的数组,然后迭代(使用.foreach或.map)它。但每个数组元素必须具有不同的样式。例如,我有一个数组如下所示: 另外,我想在另一个组件中重用数组的一些单独元素。我怎么能那样做? (假设每个元素中的最后一个单词是一个单独的样式,例如background-color或color,) 你能帮帮我吗?请给我一个建议,我会怎么做?

  • 我正在实现一个依赖于3D卷积的模型(对于类似于动作识别的任务),我想使用批量规范化(参见 下面的代码引用了TensorFlow r0.12,它显式地引用了变量——我的意思是我没有使用tf。承包商。学习tf以外的内容。承包商。图层。batch\u norm()函数。我这样做是为了更好地理解事情是如何运作的,并且有更多的实现自由度(例如,变量摘要)。 我将通过首先编写完全连接层的示例,然后编写2D卷积

  • 我问了一个关于我上周建立的一个网络的问题,我重复了一些建议,这些建议导致我发现了一些问题。我回到这个项目,解决了所有问题,并在这个过程中了解了更多关于CNN的信息。现在我陷入了一个问题:我所有的权重都变成了巨大的负值,再加上输出图像中的RELU端总是完全是黑色的(这使得分类器无法完成它的工作)。 在两个标记的图像上: 这些数据被传递到一个两层网络、一个分类器(它自己获得100%)和一个单过滤器3×

  • 我正在从事一个语义分割项目,该项目涉及动态过滤器,以学习多尺度表示。 为了创建这些过滤器,我使用Unet主干并从瓶颈层提取特征图。特征图的大小为H x W X 512,其中H是特征图的高度,W是宽度,512是通道(图)的数量。 这些特征被传递到1x1卷积,以将滤波器的数量减少到H X W X 128,并且这些特征也被传递到自适应池层,以将H X W X 512减少到k X k X 512,其中k是

  • 我正在构建一个卷积网络图像分类的目的,我的网络受到VGG conv网络的启发,但我更改了每层的层数和过滤器,因为我的图像数据集非常简单。 然而,我想知道为什么VGG中的Fitler数总是2:64的幂- 我猜这是因为每个池将输出大小除以2 x 2,因此需要将过滤器的数量乘以2。 但我仍然想知道,这一选择背后的真正原因是什么;这是为了优化吗?分配计算是否更容易?我应该在我的人际网络中保持这种逻辑吗。

  • 创建卷积神经网络(CNN)时(如中所述https://cs231n.github.io/convolutional-networks/)输入层与一个或多个过滤器连接,每个过滤器表示一个要素地图。这里,过滤层中的每个神经元只与输入层的几个神经元相连。在最简单的情况下,我的n个过滤器中的每一个都具有相同的维度并使用相同的步幅。 我的问题是: 如何确保过滤器学习不同的特征,尽管它们使用相同的补丁进行训练