Tensorflow- 如何共享卷积神经网络的滤波器权重以适用于不同的输入通道?

3

我的一个1层CNN神经网络的输入数据集有10个通道。如果我将过滤器通道设置为16,则会有10*16=160个过滤器。

我想要使用相同的16个过滤器通道权重来处理每个输入通道。也就是说,只对我的输入数据集使用16个过滤器。这意味着10个输入通道共享相同的卷积过滤器权重。

有没有人知道如何在tensorflow中实现这一点?非常感谢。

1个回答

3

您可以使用低级别的tf.nn.conv1d函数,并通过将相同单通道滤波器进行平铺得到filters参数。

f0 = tf.get_variable('filters', shape=(kernel_width, 1, filters_out), initializer=...)
f_tiled = tf.tile(f0, (1, filters_in, 1))
output = tf.nn.conv1d(input, f_tiled, ...)

然而,您可以通过将所有输入通道相加形成单通道输入,然后使用更高级别的layers API来实现相同的效果(这样会更有效率且容易出错)。

conv_input = tf.reduce_sum(input, axis=-1, keepdis=True))
output = tf.layers.conv1d(conv_input, filters=...)

请注意,除非您的所有通道几乎相等,否则这可能不是一个好主意。如果您想减少自由参数的数量,请考虑使用多个卷积 - 使用 1x1 卷积来减少滤波器的数量,使用其他卷积进行宽核和非线性操作,然后再使用 1x1 卷积将滤波器数量恢复到较大值。上述实现中的 reduce_sum 实际上是具有固定权重( tf.ones )的 1x1 卷积,除非您的数据集很小,否则学习权重并跟随一些非线性操作几乎肯定会得到更好的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接