首页 > 解决方案 > Tensorflow-如何为不同的输入通道共享 CNN 的过滤器权重?

问题描述

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

我想为每个输入通道使用相同的 16 个过滤器通道的权重。意味着只对我的输入数据集使用 16 个过滤器。表示 10 个输入通道共享相同的卷积滤波器权重。

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

标签: tensorflowmachine-learningconv-neural-network

解决方案


您可以将较低级别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, ...)

但是,您将获得相同的效果(并且效率更高且更不容易出错)只需将所有输入通道添加在一起以形成单通道输入,然后使用更高级别的layersAPI。

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

请注意,除非您的所有频道几乎相同,否则这可能是个坏主意。如果要减少自由参数的数量,请考虑使用多个卷积 - 一个 1x1 以减少过滤器的数量,其他具有宽内核和非线性的卷积,然后是一个 1x1 的卷积以返回大量过滤器。上面的reduce_sum实现实际上是一个固定权重的 1x1 卷积tf.ones,除非你的数据集很小,否则你几乎肯定会通过学习权重和一些非线性得到更好的结果。


推荐阅读