Tensorflow-如何共享不同输入通道的CNN滤波器权重?

时间:2018-08-21 19:34:04

标签: tensorflow machine-learning conv-neural-network

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

我想为每个输入通道使用相同的16个滤波器通道权重。表示仅对我的输入data_set使用16个过滤器。表示10个输入通道共享相同的卷积滤波器权重。

有人知道如何在张量流中做到这一点吗?非常感谢。

1 个答案:

答案 0 :(得分:2)

您可以将较低级别的tf.nn.conv1dfilters arg结合使用,这些参数是通过平铺相同的单通道滤波器来构造的。

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卷积,除非您的数据集很小,否则几乎可以肯定的是,通过学习权重以及一些非线性,可以得到更好的结果。