tensorflow - Tensorflow-如何为不同的输入通道共享 CNN 的过滤器权重?
问题描述
我的 1 层 CNN 神经元网络的输入数据集有 10 个通道。如果我将过滤器通道设置为 16,那么将有 10*16=160 个过滤器。
我想为每个输入通道使用相同的 16 个过滤器通道的权重。意味着只对我的输入数据集使用 16 个过滤器。表示 10 个输入通道共享相同的卷积滤波器权重。
有人知道如何在张量流中做到这一点吗?多谢。
解决方案
您可以将较低级别tf.nn.conv1d
与filters
通过平铺相同的单通道过滤器构造的 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
实现实际上是一个固定权重的 1x1 卷积tf.ones
,除非你的数据集很小,否则你几乎肯定会通过学习权重和一些非线性得到更好的结果。
推荐阅读
- python - Is there a way to assign variable in Robot Framework to python without using it as an argument?
- javascript - How do I write test for error throwing in jasmine?
- python - Plot continuous width legend denoting edge weight
- windows - 内部 Inno Setup 安装程序没有与 AppLocker 规则冲突的主安装程序的产品名称
- java - How can I ensure the configuration of
in wildfly 9? - javascript - 是否可以在 Chart.Js 中调用指令?
- c# - 如何使用linq在列表中按小时获取记录?
- javascript - 从对象中删除嵌套数组
- mysql - 更新存在重复的表上的已删除字段 - SQL 错误 (1093):您无法指定目标表
- javascript - 如何在 useState 和 useEffect 中设置初始状态