我的一个1层CNN神经网络的输入数据集有10个通道。如果我将过滤器通道设置为16,则会有10*16=160个过滤器。
我想要使用相同的16个过滤器通道权重来处理每个输入通道。也就是说,只对我的输入数据集使用16个过滤器。这意味着10个输入通道共享相同的卷积过滤器权重。
有没有人知道如何在tensorflow中实现这一点?非常感谢。
我的一个1层CNN神经网络的输入数据集有10个通道。如果我将过滤器通道设置为16,则会有10*16=160个过滤器。
我想要使用相同的16个过滤器通道权重来处理每个输入通道。也就是说,只对我的输入数据集使用16个过滤器。这意味着10个输入通道共享相同的卷积过滤器权重。
有没有人知道如何在tensorflow中实现这一点?非常感谢。
您可以使用低级别的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 卷积,除非您的数据集很小,否则学习权重并跟随一些非线性操作几乎肯定会得到更好的结果。